Классика баз данных - статьи

       

Использование индексов.


Все индексы (PRIMARY, UNIQUE и INDEX) хранятся в B-дереве. В строковых типах автоматически происходит сжатие начальных и конечных пробелов.

Индексы используются для:

    Быстрого поиска записей по условию WHERE;

    Для объединения таблиц с посредством JOIN;

    Поиска MAX() и MIN() значений для ключевых полей ;

    Для сортировки и группировки таблиц (......ORDER BY и GROUP BY);

    Для извлечения данных не из таблицы с данными, а из индексного файла. Это возможно только в некоторых случаях, например, когда все извлекаемые поля проиндексированы.

    Рассмотрим следующий запрос SELECT: SELECT * FROM tbl_name WHERE col =val AND col2=val2;

    Если таблица имеет множественный индекс (col,col2), то соответствующие записи будут выбраны напрямую. Если существуют только одиночные индексы для col и col2, то оптимизатор сначала решит, при использовании какого индекса, количество возвращаемых записей будет меньше, а затем из этих записей будет произведена выборка по другому условию.

    Если таблица имеет множественный индекс, то любой " префикс " этого индекса может использоваться для оптимизации запроса. Например, если есть индекс (col, col2, col3), то можно считать, что существуют индексы (col ); (col,col2); (col,col2,col3).

    Любая другая часть индекса не может быть использована для оптимизации. Рассмотрим для примера такие запросы: mysql> SELECT * FROM tbl_name WHERE col =val ; 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 "Patrick%"; mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";

    А следующие два запроса выполняются без использования индекса: mysql> select * from tbl_name where key_col LIKE "%Patrick%"; mysql> select * from tbl_name where key_col LIKE other_col;

    В первом из этих запросов аргумент после LIKE начинается c символа шаблона, а во втором аргумент не является константой.



    Содержание раздела