I comandi HANDLER
Sintassi
HANDLER nome_tabella OPEN [ [AS] alias] HANDLER nome_tabella READ nome_indice { = | >= | <= | < } (valore1,valore2,...) [ WHERE condizione ] [LIMIT ... ] HANDLER nome_tabella READ nome_indice { FIRST | NEXT | PREV | LAST } [ WHERE condizione ] [LIMIT ... ] HANDLER nome_tabella READ { FIRST | NEXT } [ WHERE condizione ] [LIMIT ... ] HANDLER nome_tabella CLOSE
Spiegazione
L'istruzione HANDLER
fornisce un accesso diretto alle interfacce di tabella dello Storage Engine per le ricerche con chiave e le scansioni delle tabelle. E' disponibile almeno per Aria, Memory (a partire da MariaDB 5.3), MyISAM e InnoDB (dovrebbe funzionare con la maggior parte degli Storage Engine 'normali', ma non con le tabelle di sistema, le MERGE e le viste).
A partire da MariaDB 5.3, è possibile utilizzare i Prepared Statement con HANDLER READ, e questo migliora notevolmente le performance (50%) perché non avviene un parsing e tutti i dati vengono trasformati in binari (non vengono convertiti in testo, come avviene con il protocollo normale).
Ricerche per chiave
Una ricerca per chiave si ottiene così:
HANDLER nome_tabella READ nome_indice { = | >= | <= | < } (valore,valore) [LIMIT...]
I valori sono quelli delle varie colonne della chiave. Per la maggior parte dei tipi di indice (ad eccezione delle chiavi HASH nelle tabelle MEMORY) è possibile utilizzare un sottoinsieme dei prefissi delle colonne.
Se si fa uso di LIMIT, in caso di >= o > si verifica un NEXT implicito, mentre se si utilizza <= o < avviene un PREV implicito.
Dopo la lettura iniziale, è possibile utilizzare:
HANDLER nome_tabella READ nome_indice NEXT [ LIMIT ... ] o HANDLER nome_tabella READ nome_indice PREV [ LIMIT ... ]
per scansire la tabella nell'ordine definito dalla chiave.
Si noti che l'ordine delle righe non è definito per le chiavi che hanno valori duplicati e varia a seconda dello Storage Engine.
Scansioni per chiave
E' possibile scansionare una tabella nell'ordine definito dalla chiave in questo modo:
HANDLER nome_tabella READ nome_indice FIRST [ LIMIT ... ] HANDLER nome_tabella READ nome_indice NEXT [ LIMIT ... ]
Oppure, se l'handler supporta la scansione in ordine inverso (di solito è così):
HANDLER nome_tabella READ nome_indice LAST [ LIMIT ... ] HANDLER nome_tabella READ nome_indice PREV [ LIMIT ... ]
Scansione delle tabelle
E' possibile effettuare la scansione completa della tabella seguendo l'ordine fisico delle righe in questo modo:
HANDLER nome_tabella READ FIRST [ LIMIT ... ] HANDLER nome_tabella READ NEXT [ LIMIT ... ]
Trovare le 'righe vecchie'
HANDLER READ non è sicuro con le transazioni, consistenti o atomiche. E' giusto che lo Storage Engine restituisca righe che esistevano quando è iniziata la scansione ma che poi sono state eliminate. Questo può accadere se lo Storage Engine ha inserito le righe in una cache durante una lettura precedente.
E' anche possibile trovare righe che sono state inserite con una COMMIT dopo che è iniziata la scansione.
Limitazioni
Siccome questa è un'interfaccia diretta con lo Storage Engine, potrebbero verificarsi alcune limitazioni su ciò che si fa, o su ciò che avviene se la tabelle viene modificata. Ecco alcune delle limitazioni più comuni:
- Sei si esegue una ALTER TABLE, tutti gli HANDLER su quella tabella vengono chiusi automaticamente.
- Se si esegue una ALTER TABLE su una tabella utilizzata da altre connessioni tramite HANDLER, la ALTER TABLE attenderà che HANDLER sia chiuso.
- Per le chiavi HASH, è necessario utilizzare tutte le parti della chiave quando si cerca una riga.
- Per le chiavi HASH, non è possibile eseguire una scansione della chiave su tutti i valori. Si possono trovare solo le righe con gli stessi valori della chiave.
- Nonostante ogni comando HANDLER READ sia atomico, se viene utilizzato più volte per eseguire una scansione, alcuni Storage Engine potrebbero restituire un errore 1020 nel caso in cui la tabella venga modificata fra un comando e l'altro. Se questo avviene, si veda la pagina dell'handler engine specifico.
Codici di errore
- Error 1031 (ER_ILLEGAL_HA) Table storage engine for 't1' doesn't have this option
- Se si ottiene questo errore con HANDLER OPEN significa che lo Storage Engine non supporta le chiamate a HANDLER.
- Se lo si ottiene con HANDLER READ significa che si sta tentando di leggere solo una parte di una chiave HASH.
- Error 1020 (ER_CHECKREAD) Record has changed since last read in table '...'
- Significa che la tabella è stata modificata tra una lettura e l'altra, e l'handler non sa come gestire questa situazione.
Si consultino anche le pagine della KB sull'handler specifico, per conoscere le sue limitazioni.