Spec-Zone.ru › MariaDB

Расширенные ключи

Синтаксис

Включить:

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$.

Используя расширенные ключи, запрос может быть выполнен по следующему плану выполнения:

  1. Сканировать записи индекса i_p_retailprice где p_retailprice>2095 и читать значения p_partkey из расширенных ключей.
  2. Для каждого значения p_partkey выполнить поиск в таблице lineitem по индексу i_l_partkey и извлечь значения l_orderkey из расширенного индекса.
  3. Для каждого извлечённого значения 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)

См. также

  • MWL#247
  • Статья блога о разработке этой функции
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно MariaDB. Мнения, информация и мнения, выраженные в этом контенте, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API