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

13.2.9.3. Индексируйте Синтаксис Подсказки

Можно обеспечить подсказки, чтобы дать информацию об оптимизаторе о том, как выбрать, индексирует во время обработки запроса. Раздел 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 (index_list), можно сказать, что MySQL, чтобы использовать только один из именованных индексирует, чтобы найти строки в таблице. Альтернативный синтаксис IGNORE INDEX (index_list) может использоваться, чтобы сказать, что MySQL, чтобы не использовать некоторую деталь индексирует, или индексирует. Эти подсказки полезны если 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;

Синтаксис для индексирует подсказки, имеет следующие характеристики:

если Вы определяете нет 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);

Индексировать подсказки тогда применяются для каждого контекста в следующем порядке:

  1. {USE|FORCE} INDEX применяется если существующий. (В противном случае определенный оптимизатором набор индексирует, используется.)

  2. IGNORE INDEX применяется по результату предыдущего шага. Например, следующие два запроса эквивалентны:

    SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);SELECT * FROM t1 USE INDEX (i1);

Для 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 ... ;