Spec-Zone .ru
спецификации, руководства, описания, API
|
MySQL может создать сводные индексы (то есть, индексирует на многократных столбцах). Индексирование может состоять из 16 столбцов. Для определенных типов данных можно индексировать префикс столбца (см. Раздел 8.3.4, "Столбец Индексирует").
MySQL может использовать многократный столбец, индексирует для запросов, которые тестируют все столбцы в индексировании, или запросы, которые тестируют только первый столбец, первые два столбца, первые три столбца, и так далее. Если Вы определяете столбцы в правильном порядке в индексировать определении, единственный сводный индекс может ускорить несколько видов запросов на той же самой таблице.
Многократный столбец индексирует, может считаться сортированным массивом, строки которого содержат стоимость, которая создается, связывая значения индексированных столбцов.
Как альтернатива сводному индексу, можно представить столбец, который "хешируется" основанный на информации от других столбцов. Если этот столбец короток, разумно уникален, и индексированный, это могло бы быть быстрее, чем "широкое" индексирует на многих столбцах. В MySQL это очень удобно этот дополнительный столбец:
SELECT * FROMtbl_name
WHEREhash_col
=MD5(CONCAT(val1
,val2
)) ANDcol1
=val1
ANDcol2
=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 * FROMtbl_name
WHERE col1=val1
;SELECT * FROMtbl_name
WHERE col1=val1
AND col2=val2
;SELECT * FROMtbl_name
WHERE col2=val2
;SELECT * FROMtbl_name
WHERE col2=val2
AND col3=val3
;
Если индексирование существует на (col1, col2, col3)
, только первые два запроса
используют индексирование. Третьи и четвертые запросы действительно включают индексированные столбцы, но (col2)
и (col2, col3)
не крайние левые префиксы
(col1, col2, col3)
.