Chiavi Estese

Sintassi

Per abilitare:

set optimizer_switch='extended_keys=on';

Per disabilitare:

set optimizer_switch='extended_keys=off';

Il default è 'extended_keys=off' .

Spiegazione

Le Chiavi Estese, introdotte in MariaDB 5.5, sono un'ottimizzazione che fa uso di componenti già esistenti delle chiavi di InnoDB/XtraDB per generare piani di esecuzione più efficienti. L'uso di questi componenti in molti casi permette al server di risolvere una query utilizzando esclusivamente ricerche basate sugli indici.

Le Chiavi Estese si possono usare con:

  • accessi ref e eq-ref
  • scansioni di intervalli
  • scansioni index-merge
  • scansioni allargate
  • ottimizzazioni min/max

Esempi

Ecco un esempio di come si possono impiegare le Chiavi Estese per una query costruita su un database DBT-3/TPC-H, con un indice aggiuntivo in 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;

La query qui sopra chiede orderkeys degli ordini effettuati il 1992-07-01, che contengono parti con un prezzo al dettaglio maggiore di $2095.

Utilizzando le Chiavi Estese, la query potrebbe essere eseguita tramite il piano seguente:

  1. Scansire le voci dell'indice i_p_retailprice dove p_retailprice>2095 e leggere i valori p_partkey dalle Chiavi Estese.
  2. Per ogni valore p_partkey eseguire un'altra ricerca su indice nella tabella lineitem, usando l'indice i_l_partkey ed estrarre i valori di l_orderkey dalla Chiave Estesa.
  3. Per ogni valore estratto da l_orderkey, aggiungerlo alla data '1992-07-01' e utilizzare la chiave risultante per una ricerca sull'indice i_o_orderdate, per estrarre i valori di o_orderkey.

Nessuno dei metodi di accesso usati da questo piano va a toccare le righe della tabella, pertanto si hanno prestazioni di gran lunga migliori.

Ecco l'output di EXPLAIN per la query sopra riportata:

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)

Vedi anche

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.