Spec-Zone.ru › MySQL 5.7

8.3.8 Сравнение индексов B-дерева и хеш-таблицы

Изучение структур данных B-дерева и хеш-таблицы может помочь предсказать, как различные запросы будут выполняться в разных хранилищах данных, которые используют эти структуры в своих индексах, особенно для хранилища данных MEMORY, которое позволяет вам выбирать индексы B-дерева или хеш-таблицы.

  • Характеристики индекса 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 NULL, использует индексы, если col_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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/index-btree-hash.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API