Mysql
 sql >> Database >  >> RDS >> Mysql

indicizzare un campo di bit in MySQL

In generale, no. Un campo bi-stato non velocizza le query quando indicizzato perché in media devi guardare metà delle righe. Vuoi che le voci dell'indice siano selettive:una determinata voce nell'indice dovrebbe rappresentare solo una piccola percentuale dei valori possibili (ad esempio, meno del 10%, preferibilmente in frazioni di percentuale). Quindi l'utilizzo dell'indice ignora la maggior parte dei dati nella tabella, che è ciò che ti offre un vantaggio in termini di prestazioni.

Alcuni DBMS supportano gli indici bitmap. Possono aiutare, ma ti imbatti ancora nel problema della selettività.

La domanda aggiornata dice che il numero di valori con valore 1 sarà piccolo (meno dell'uno per cento); un indice ti darà un vantaggio ora?

La risposta è:

  • Per quelle query in cui si specifica che il valore è 1, allora sì, un indice nella colonna potrebbe fornire un vantaggio, a condizione che l'ottimizzatore utilizzi effettivamente l'indice. Potrebbe essere necessario modificare il DBMS per rendersi conto che l'indice è distorto a favore dell'utilizzo con query in cui il valore è 1; questo tende ad essere specifico del DBMS, ma l'aggiornamento delle statistiche in varie forme è il nome del gioco, possibilmente usando anche suggerimenti nelle query SQL. Naturalmente, se l'ottimizzatore non utilizza mai l'indice, non offre comunque alcun vantaggio e l'ottimizzatore potrebbe decidere che altri indici lo aiutino maggiormente in qualche modo.

  • Per le query in cui il valore è 0, l'indice non deve essere utilizzato. Tuttavia, è probabile che il DBMS continui a mantenere l'indice anche per i valori 0, anche se non dovrebbe mai usarli. Sarebbe un DBMS insolito che potrebbe essere comandato "indicizza questa colonna solo per valori diversi da zero", anche se sarebbe molto vantaggioso.

Quindi - dipende. Dipende dalle query e dipende dall'ottimizzatore.

Si noti inoltre che un indice composito - su alcune altre colonne usate abitualmente e quindi il campo di bit potrebbe fornire qualche vantaggio. Quindi, se selezioni quasi sempre un intervallo di date, un indice composto nelle colonne data e campo di bit (probabilmente in quest'ordine) dovrebbe fornirti un buon indice.