Spec-Zone .ru
спецификации, руководства, описания, API

8.3.5. Многократный столбец Индексирует

MySQL может создать сводные индексы (то есть, индексирует на многократных столбцах). Индексирование может состоять из 16 столбцов. Для определенных типов данных можно индексировать префикс столбца (см. Раздел 8.3.4, "Столбец Индексирует").

MySQL может использовать многократный столбец, индексирует для запросов, которые тестируют все столбцы в индексировании, или запросы, которые тестируют только первый столбец, первые два столбца, первые три столбца, и так далее. Если Вы определяете столбцы в правильном порядке в индексировать определении, единственный сводный индекс может ускорить несколько видов запросов на той же самой таблице.

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

Отметить

Как альтернатива сводному индексу, можно представить столбец, который "хешируется" основанный на информации от других столбцов. Если этот столбец короток, разумно уникален, и индексированный, это могло бы быть быстрее, чем "широкое" индексирует на многих столбцах. В MySQL это очень удобно этот дополнительный столбец:

SELECT * FROM tbl_name  WHERE hash_col=MD5(CONCAT(val1,val2))  AND col1=val1 AND col2=val2;

Предположите, что у таблицы есть следующая спецификация:

CREATE TABLE test (    id         INT NOT NULL,    last_name  CHAR(30) NOT NULL,    first_name CHAR(30) NOT NULL,    PRIMARY KEY (id),    INDEX name (last_name,first_name));

name индексируйте индексирование по last_name и first_name столбцы. Индексирование может использоваться для поисков в запросах, которые определяют значения в известном диапазоне для комбинаций last_name и first_name значения. Это может также использоваться для запросов, которые определяют только a last_name оцените, потому что тот столбец является крайним левым префиксом индексирования (как описано позже в этом разделе). Поэтому, name индексируйте используется для поисков в следующих запросах:

SELECT * FROM test WHERE last_name='Widenius';SELECT * FROM test  WHERE last_name='Widenius' AND first_name='Michael';SELECT * FROM test  WHERE last_name='Widenius'  AND (first_name='Michael' OR first_name='Monty');SELECT * FROM test  WHERE last_name='Widenius'  AND first_name >='M' AND first_name < 'N';

Однако, name индексируйте не используется для поисков в следующих запросах:

SELECT * FROM test WHERE first_name='Michael';SELECT * FROM test  WHERE last_name='Widenius' OR first_name='Michael';

Предположите, что Вы выпускаете следующий SELECT оператор:

mysql> SELECT * FROM tbl_name
        WHERE col1=val1 AND col2=val2;

Если многократный столбец индексирует, существует на col1 и col2, соответствующие строки могут быть выбраны непосредственно. Если отдельный единственный столбец индексирует, существуют на col1 и col2, оптимизатор пытается использовать Индексировать оптимизацию Слияния (см. Раздел 8.13.2, "Индексируйте Оптимизация Слияния"), или пытается найти, что самые рестриктивные индексируют, решая, которые индексируют, исключает больше строк и использования, которые индексируют, чтобы выбрать строки.

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

MySQL не может использовать индексирование, чтобы выполнить поиски, если столбцы не формируют крайний левый префикс из индексирования. Предположите, что Вы имеете SELECT операторы, показанные здесь:

SELECT * FROM tbl_name WHERE col1=val1;SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;SELECT * FROM tbl_name WHERE col2=val2;SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

Если индексирование существует на (col1, col2, col3), только первые два запроса используют индексирование. Третьи и четвертые запросы действительно включают индексированные столбцы, но (col2) и (col2, col3) не крайние левые префиксы (col1, col2, col3).