Расширенные ключи
Синтаксис
Включить:
set optimizer_switch='extended_keys=on';
Отключить:
set optimizer_switch='extended_keys=off';
Описание
Расширенные ключи — это набор оптимизаций, используемый с системной переменной optimizer_switch, который использует существующие компоненты ключей InnoDB для генерации более эффективных планов выполнения. Использование этих компонентов во многих случаях позволяет серверу генерировать планы выполнения, использующие только индексные запросы. Он включён по умолчанию.
Расширенные ключи могут использоваться с:
- доступами ref и eq-ref
- диапазонными сканированиями
- сканированиями с объединением индексов
- слабыми сканированиями
- оптимизациями min/max
Примеры
Пример того, как расширенные ключи могут быть использованы для запроса, построенного на базе данных DBT-3/TPC-H с добавленным индексом, определённым на p_retailprice:
select o_orderkey
from part, lineitem, orders
where p_retailprice > 2095 and o_orderdate='1992-07-01'
and o_orderkey=l_orderkey and p_partkey=l_partkey;
Вышеприведённый запрос ищет orderkeys заказов, оформленных 01.07.1992, содержащих детали с розничной ценой более 2095$.
Используя расширенные ключи, запрос может быть выполнен по следующему плану выполнения:
- Сканировать записи индекса
i_p_retailpriceгдеp_retailprice>2095и читать значенияp_partkeyиз расширенных ключей. - Для каждого значения
p_partkeyвыполнить поиск в таблице lineitem по индексуi_l_partkeyи извлечь значенияl_orderkeyиз расширенного индекса. - Для каждого извлечённого значения
l_orderkeyдобавить его к дате'1992-07-01'и использовать полученный ключ для поиска по индексуi_o_orderdate, чтобы получить значенияo_orderkeyиз найденных записей индекса.
Все методы доступа в этом плане не затрагивают строки таблицы, что приводит к значительно лучшему времени выполнения.
Вот результат explain для вышеприведённого запроса:
MariaDB [dbt3sf10]> explain
-> select o_orderkey
-> from part, lineitem, orders
-> where p_retailprice > 2095 and o_orderdate='1992-07-01'
-> and o_orderkey=l_orderkey and p_partkey=l_partkey\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: part
type: range
possible_keys: PRIMARY,i_p_retailprice
key: i_p_retailprice
key_len: 9
ref: NULL
rows: 100
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: lineitem
type: ref
possible_keys: PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_orderkey,i_l_orderkey_quantity
key: i_l_partkey
key_len: 5
ref: dbt3sf10.part.p_partkey
rows: 15
Extra: Using index
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: orders
type: ref
possible_keys: PRIMARY,i_o_orderdate
key: i_o_orderdate
key_len: 8
ref: const,dbt3sf10.lineitem.l_orderkey
rows: 1
Extra: Using index
3 rows in set (0.00 sec)
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/extended-keys/