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:
- Scansire le voci dell'indice
i_p_retailprice
dovep_retailprice>2095
e leggere i valorip_partkey
dalle Chiavi Estese. - Per ogni valore
p_partkey
eseguire un'altra ricerca su indice nella tabella lineitem, usando l'indicei_l_partkey
ed estrarre i valori dil_orderkey
dalla Chiave Estesa. - Per ogni valore estratto da
l_orderkey
, aggiungerlo alla data'1992-07-01'
e utilizzare la chiave risultante per una ricerca sull'indicei_o_orderdate
, per estrarre i valori dio_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)