Использование индексов в mySQL
Все индексы (PRIMARY, UNIQUE, KEY, INDEX и FULLTEXT) хранятся в B-дереве. В строковых типах автоматически происходит сжатие начальных и конечных пробелов.
Индексы используются для:
- Быстрого поиска записей по условию
WHERE; - Для объединения таблиц с посредством
JOIN. Необходимо использовать одинаковые типы сравниваемых полей. Если для сравнения необходимо произвести преобразование типов, то индексы использоваться не будут; - Для выбора наименьшего количества совпадений. Если есть множественный индекс, то использоваться будет тот индекс, который находит самое маленький число строк.
- Поиска
MAXиMINзначений для ключевых полей ; - Для сортировки и группировки таблиц (……
ORDER BYиGROUP BY); - Для извлечения данных не из таблицы с данными, а из индексного файла. Это возможно только в некоторых случаях, например, когда все извлекаемые поля проиндексированы.
Рассмотрим следующий запрос:
Если таблица имеет множественный индекс (col,col2), то соответствующие записи будут выбраны напрямую. Если существуют только одиночные индексы для col и col2, то оптимизатор сначала решит, при использовании какого индекса, количество возвращаемых записей будет меньше, а затем из этих записей будет произведена выборка по другому условию.
Если таблица имеет множественный индекс, то любой “префикс” этого индекса может использоваться для оптимизации запроса. Например, если есть индекс (col, col2, col3), то можно считать, что существуют индексы (col ); (col,col2); (col,col2,col3).
Любая другая часть индекса не может быть использована для оптимизации. Рассмотрим для примера такие запросы:
mysql> SELECT * FROM tbl_name WHERE col2=val2;
mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
Если есть индекс (col,col2,col3), то только в первом запросе будет использоваться индекс. Хотя второй и третий запросы содержат столбцы, которые присутствуют в индексе, но (col2) и (col2,col3) не являются левыми частями множественного индекса, и поэтому при выполнении этих запросов индекс применяться не будет.
MySQL также использует индексы для LIKE операций, если аргумент LIKE является строковой константой и при этом не начинается с символа шаблона (% или _). Например, следующие SELECT запросы используют индекс для key_col:
mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Pat%_ck%";
А следующие два запроса выполняются без использования индекса:
mysql> SELECT * FROM tbl_name WHERE key_col LIKE other_col;
В первом из этих запросов аргумент после LIKE начинается c символа шаблона, а во втором аргумент не является константой.
При поиске с выражением key_col IS NULL индекс используется.
