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

Perché le prestazioni delle query MySQL sono così scarse quando si utilizza un indice CHAR/VARCHAR?

Chiaramente, il problema è che la query sta eseguendo una scansione dell'indice. L'approccio alternativo consiste nell'eseguire due ricerche nell'indice, per il primo e l'ultimo valore che sono gli stessi, e quindi utilizzare le metainformazioni nell'indice per il calcolo. Sulla base delle tue osservazioni, MySQL fa entrambe le cose.

Il resto di questa risposta è speculazione.

Il motivo per cui le prestazioni sono "solo" 300 volte più lente, anziché 200.000 volte più lente, è dovuto al sovraccarico nella lettura dell'indice. In realtà, la scansione delle voci è abbastanza veloce rispetto ad altre operazioni necessarie.

C'è una differenza fondamentale tra numeri e stringhe quando si tratta di confronti. Il motore può semplicemente guardare le rappresentazioni in bit di due numeri e riconoscere se sono uguali o diversi. Sfortunatamente, per le stringhe, è necessario tenere conto della codifica/collazione. Penso che sia per questo che deve guardare ai valori.

È possibile che se avessi 216.000 copie di esattamente la stessa stringa, quindi MySQL sarebbe in grado di eseguire il conteggio utilizzando i metadati nell'indice. In altre parole, l'indicizzatore è abbastanza intelligente da utilizzare i metadati per confronti di uguaglianza esatta. Ma non è abbastanza intelligente da tenere conto della codifica.