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

Optimización de consultas MySQL de LIKE term% ORDER BY int

Usted hizo otra pregunta "Crear un índice que sea mejor para la búsqueda con comodines a través de 40 millones de nombres". Vale, tienes 40 millones de registros.

Ahora considere la siguiente fórmula:

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Un índice en una columna es mucho mejor, cuanto más cerca x es a 1. Si es 1, todos los valores son distintos, no hay duplicados y, por lo tanto, un índice es bastante rápido.

Ahora está buscando 'john%'. Son 4 letras y un final abierto. Qué letras no son importantes, su base de datos tiene que lidiar con 26 * 26 * 26 * 26 =456976 valores distintos. Pon eso en la fórmula anterior y tus 40 millones de registros. Obtienes una x de 0,0114244.

No sé cuál es el umbral nuevamente, pero IIRC es 0,1 o algo así. Entonces, si eres x está por encima de 0,1 se usa el índice, si es más bajo, no.

¿Por qué es así? El uso de un índice puede incluso ralentizar las cosas, porque su base de datos tiene que mirar el índice, ver en ese índice en qué posición en su disco duro físico está el registro apropiado y luego obtener ese registro. Por lo tanto, cuando x está por debajo del 10 %, es más rápido hacer un escaneo de toda la tabla.

Para resumir:Filtrar 40 millones de registros con un solo índice débil como el suyo es simplemente inútil.