sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué el rendimiento de las consultas MySQL es tan malo cuando se usa un índice CHAR/VARCHAR?

Claramente, el problema es que la consulta está haciendo un escaneo de índice. El enfoque alternativo sería realizar dos búsquedas en el índice, para el primer y el último valor que sean iguales, y luego usar metainformación en el índice para el cálculo. Según sus observaciones, MySQL hace ambas cosas.

El resto de esta respuesta es especulación.

La razón por la que el rendimiento es "solo" 300 veces más lento, en lugar de 200.000 veces más lento, se debe a la sobrecarga en la lectura del índice. En realidad, escanear las entradas es bastante rápido en comparación con otras operaciones que se necesitan.

Hay una diferencia fundamental entre números y cadenas cuando se trata de comparaciones. El motor puede simplemente mirar las representaciones de bits de dos números y reconocer si son iguales o diferentes. Desafortunadamente, para las cadenas, debe tener en cuenta la codificación/intercalación. Creo que es por eso que necesita mirar los valores.

Es posible que si tuviera 216.000 copias de exactamente la misma cadena, entonces MySQL podría hacer el conteo usando metadatos en el índice. En otras palabras, el indexador es lo suficientemente inteligente como para usar metadatos para comparaciones de igualdad exacta. Pero no es lo suficientemente inteligente como para tener en cuenta la codificación.