10.3.9 Сравнение индексов B-дерева и хэша
Понимание структур данных B-дерева и хэша может помочь предсказать, как разные запросы работают с разными движками хранения, которые используют эти структуры данных в своих индексах, особенно для движка хранения MEMORY, который позволяет выбирать индексы B-дерева или хэша.
Характеристики индекса B-дерева
Индекс B-дерева может использоваться для сравнения столбцов в выражениях, использующих операторы =, >, >=, <, <= или BETWEEN. Индекс также может использоваться для сравнений LIKE, если аргумент к LIKE — это строковая константа, которая не начинается с символа подстановки. Например, следующие операторы SELECT используют индексы:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
В первом операторе рассматриваются только строки с 'Patrick'
<= . Во втором операторе рассматриваются только строки с key_col <
'Patricl''Pat' <=
.key_col < 'Pau'
Следующие операторы SELECT не используют индексы:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;
В первом операторе значение LIKE начинается с символа подстановки. Во втором операторе значение LIKE не является константой.
Если вы используете ... LIKE
'% и string%'string длиннее трёх символов, MySQL использует алгоритм Turbo Boyer-Moore для инициализации шаблона для строки, а затем использует этот шаблон для более быстрого поиска.
Поиск с помощью использует индексы, если col_name IS
NULLcol_name проиндексирован.
Любой индекс, который не охватывает все уровни AND в предложении WHERE, не используется для оптимизации запроса. Другими словами, чтобы индекс можно было использовать, его префикс должен использоваться в каждой группе AND.
Следующие предложения WHERE используют индексы:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3
/* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
/* optimized like "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
/* Can use index on index1 but not on index2 or index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
Эти предложения WHERE не используют индексы:
/* index_part1 is not used */
... WHERE index_part2=1 AND index_part3=2
/* Index is not used in both parts of the WHERE clause */
... WHERE index=1 OR A=10
/* No index spans all rows */
... WHERE index_part1=1 OR index_part2=10
Иногда MySQL не использует индекс, даже если он доступен. Одна из таких ситуаций — когда оптимизатор оценивает, что использование индекса потребует от MySQL доступа к очень большому проценту строк в таблице. (В этом случае сканирование таблицы, вероятно, будет намного быстрее, потому что требует меньше поисков.) Однако, если такой запрос использует LIMIT для извлечения только некоторых строк, MySQL использует индекс, потому что он может гораздо быстрее найти несколько строк для возврата в результате.
Характеристики индекса хэша
Индексы хэша имеют несколько другие характеристики по сравнению с описанными выше:
Они используются только для сравнений на равенство, использующих операторы
=или<=>(но очень быстры). Они не используются для операторов сравнения, таких как<, которые находят диапазон значений. Системы, которые полагаются на этот тип поиска по единственному значению, известны как «магазины ключей-значений»; чтобы использовать MySQL для таких приложений, используйте индексы хэша по возможности.Оптимизатор не может использовать индекс хэша для ускорения операций
ORDER BY. (Этот тип индекса нельзя использовать для поиска следующей записи в порядке.)MySQL не может определить приблизительно количество строк между двумя значениями (это используется оптимизатором диапазонов для выбора индекса). Это может повлиять на некоторые запросы, если вы измените таблицу
MyISAMилиInnoDBна таблицу с индексом хэшаMEMORY.Для поиска строки можно использовать только целые ключи. (С индексом B-дерева можно использовать любой левосторонний префикс ключа для поиска строк.)
© 2025 Oracle
Licensed under the GPLv2 License.