Spec-Zone .ru
спецификации, руководства, описания, API
|
Можно обеспечить подсказки, чтобы дать информацию об оптимизаторе о том, как выбрать, индексирует во время
обработки запроса. Раздел 13.2.9.2,"JOIN
Синтаксис", описывает общий синтаксис для того, чтобы определить
таблицы в a SELECT
оператор. Синтаксис для отдельной таблицы, включая которую для индексируют подсказки, похож на это:
tbl_name
[[AS]alias
] [index_hint_list
]index_hint_list
:index_hint
[,index_hint
] ...index_hint
: USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list
]) | IGNORE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list
) | FORCE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list
)index_list
:index_name
[,index_name
] ...
Определяя USE INDEX (
, можно
сказать, что MySQL, чтобы использовать только один из именованных индексирует, чтобы найти строки в таблице.
Альтернативный синтаксис index_list
)IGNORE INDEX (
может использоваться, чтобы сказать, что MySQL,
чтобы не использовать некоторую деталь индексирует, или индексирует. Эти подсказки полезны если index_list
)EXPLAIN
шоу, что MySQL использует несправедливость, индексируют от списка
возможных, индексирует.
Можно также использовать FORCE INDEX
, который действует как USE
INDEX (
но с дополнением, что сканирование таблицы,
как предполагается, очень дорого. Другими словами сканирование таблицы
используется, только если нет никакого способа использовать один из данных, индексирует, чтобы найти строки в
таблице. index_list
)
Каждая подсказка требует, чтобы имена индексировали, не имена столбцов.
Имя a PRIMARY KEY
PRIMARY
. Чтобы видеть имена индексов
для таблицы, использовать SHOW INDEX
.
index_name
оцените не должно быть полное имя индекса. Это может быть
однозначный префикс имени индекса. Если префикс неоднозначен, ошибка происходит.
Примеры:
SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3;SELECT * FROM table1 IGNORE INDEX (col3_index) WHERE col1=1 AND col2=2 AND col3=3;
Синтаксис для индексирует подсказки, имеет следующие характеристики:
Это синтаксически допустимо, чтобы определить пустое index_list
для USE INDEX
, что означает, что "использование не индексирует." Определение пустого index_list
для FORCE INDEX
или IGNORE INDEX
синтаксическая ошибка.
Можно определить контекст индексировать подсказки, добавляя a FOR
пункт к подсказке. Это обеспечивает более мелкомодульное управление
выбором оптимизатора плана выполнения относительно различных фаз обработки запроса. Чтобы влиять только
на индексирование используемого, когда MySQL решает, как найти строки в таблице и как обработать
соединения, использовать FOR JOIN
. Чтобы влиять индексируют использование
для сортировки или группировки строк, используют FOR ORDER BY
или FOR GROUP BY
. (Однако, если есть покрытие, индексируют для таблицы, и это
используется, чтобы получить доступ к таблице, оптимизатор проигнорирует IGNORE
INDEX FOR {ORDER BY|GROUP BY}
подсказки, которые отключают, которые индексируют.)
Можно определить многократный, индексируют подсказки:
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;
Это не ошибка назвать то же самое, индексируют в нескольких подсказках (даже в пределах той же самой подсказки):
SELECT * FROM t1 USE INDEX (i1) USE INDEX (i1,i1);
Однако, это - ошибка смешаться USE INDEX
и FORCE
INDEX
для той же самой таблицы:
SELECT * FROM t1 USE INDEX FOR JOIN (i1) FORCE INDEX FOR JOIN (i2);
если Вы определяете нет FOR
пункт для индексировать подсказки, подсказка по
умолчанию применяется ко всем частям оператора. Например, эта подсказка:
IGNORE INDEX (i1)
эквивалентно этой комбинации подсказок:
IGNORE INDEX FOR JOIN (i1)IGNORE INDEX FOR ORDER BY (i1)IGNORE INDEX FOR GROUP BY (i1)
Заставить сервер использовать более старое поведение для контекста подсказки когда нет FOR
пункт присутствует (так, чтобы подсказки применялись только к извлечению строки),
включите old
системная переменная при запуске сервера. Заботьтесь о включении этой переменной в установке репликации. С
основанным на операторе двоичным журналированием, имея различные режимы для ведущего устройства и ведомых
устройств мог бы привести к ошибкам репликации.
Когда индексируют подсказки, обрабатываются, они собираются в единственном списке типом (USE
, FORCE
, IGNORE
) и
контекстом (FOR JOIN
, FOR ORDER BY
, FOR GROUP BY
). Например:
SELECT * FROM t1 USE INDEX () IGNORE INDEX (i2) USE INDEX (i1) USE INDEX (i2);
эквивалентно:
SELECT * FROM t1 USE INDEX (i1,i2) IGNORE INDEX (i2);
Индексировать подсказки тогда применяются для каждого контекста в следующем порядке:
{USE|FORCE} INDEX
применяется если существующий. (В
противном случае определенный оптимизатором набор индексирует, используется.)
IGNORE INDEX
применяется по результату предыдущего
шага. Например, следующие два запроса эквивалентны:
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);SELECT * FROM t1 USE INDEX (i1);
Для FULLTEXT
поискы, индексируйте работу подсказок следующим образом:
Для поисков режима естественного языка индексируйте подсказки, тихо игнорируются.
Например, IGNORE INDEX(i)
игнорируется без предупреждения, и индексирование
все еще используется.
Для булевых поисков режима индексируйте подсказки с FOR ORDER BY
или
FOR GROUP BY
тихо игнорируются. Индексируйте подсказки с FOR JOIN
или нет FOR
модификатор
соблюдают. В отличие от того, как подсказки просят не -FULLTEXT
поискы,
подсказка используется для всех фаз выполнения запроса (находящий строки и извлечение, группировку,
и упорядочивание). Это - истина, даже если подсказка дается для не -FULLTEXT
индексировать.
Например, следующие два запроса эквивалентны:
SELECT * FROM t USE INDEX (index1) IGNORE INDEX (index1) FOR ORDER BY IGNORE INDEX (index1) FOR GROUP BY WHERE ... IN BOOLEAN MODE ... ;SELECT * FROM t USE INDEX (index1)WHERE ... IN BOOLEAN MODE ... ;