Fallos del índice y soluciones

Escenarios que pueden causar fallas en el índice

1. Las columnas de índice no son independientes. Independiente significa: la columna no puede ser parte de una expresión ni un parámetro de una función.

Por ejemplo:
hay cálculos en el lado izquierdo de la condición where

explain
select * from employees where emp_no + 1 = 10003;

La explicación en este momento es todo

solución:

Cambie la condición a la derecha de la condición where:

explain
select * from exployee where emp_no = 10003 -1;

La explicación en este momento es constante.

2. Se usa el desenfoque a la izquierda

P.ej:

explain * from employees where first_name like '%Geo%'

Solución:
Trate de evitar usar la conexión izquierda, si no puede evitarlo, puede considerar usar un motor de búsqueda para resolverlo;

explain * from employees where first_name like 'Geo%'

3. Algunos de los campos que se consultan utilizando o no están indexados

Por ejemplo: first_name tiene un índice, last_name no tiene índice, entonces la siguiente declaración no puede usar el índice

explain
select * from employees where first_name = 'Georgi'
							or last_name = 'Georgi';

solución:

Agregue un índice adicional o condicional. En este momento, la base de datos fusionará los dos índices de forma predeterminada, evitando un escaneo completo de la tabla.

4. La condición de la cadena es causada por el uso de ''

Ejemplo: las condiciones de la cadena no son causadas por '' (dept_no es una cadena)

explain 
select * from dept_emp
where dept_no = 3;

El tipo de resultado es todo

Solución: agregar '', sql de escritura estándar

5. Consultas que no cumplen con el principio de prefijo más a la izquierda

solución:

Ajustar el orden del índice para que se convierta en índice (nombre, apellido)

6. Se recomienda agregar la restricción NOT NULL para los campos de índice.

Los índices de una sola columna no pueden almacenar valores nulos y los índices compuestos no pueden almacenar todos los valores nulos. Al realizar
consultas, cuando se usa la condición es nula, no se puede usar el índice y solo se puede escanear la tabla completa en
mysql. La recomendación oficial es definir el campo tan NOT NULL como sea posible

solución:

Establezca el campo de índice en NOT NULL, incluso puede establecer todos los campos en NOT NULL y establecer el valor predeterminado para el campo

7. La conversión implícita provoca fallos en el índice.

Al crear una tabla, intente ser lo más estándar posible: por ejemplo, use int o bigint

Tipo de índice (6 de uso común):

La falla del índice es un
índice de cobertura total (exploración de tabla completa) : obtenga los resultados de la consulta directamente del índice. Para utilizar un índice de cobertura, debe prestar atención a la columna de consulta seleccionada incluida en la columna de índice; donde las condiciones incluyen la columna de índice o la columna principal del índice compuesto; consulta La longitud del campo del resultado es lo más pequeña posible.

1. todos

"Escaneo de tabla completo" generalmente significa que su declaración SQL está en el estado más nativo y tiene mucho espacio para la optimización. Debemos evitar este tipo de búsqueda a menos que sea necesario.

2. índice

Este tipo de conexión es solo otra forma de escaneo de tabla completa, pero su orden de escaneo está de acuerdo con el orden del índice. Este tipo de escaneo se basa en el índice y luego regresa a la tabla para obtener datos. En comparación con todos, ambos obtienen los datos de toda la tabla, y el índice primero debe leer el índice y volver a la tabla para obtener datos de forma aleatoria. .

3. rango

El rango se refiere a un rango de escaneos de índice. En comparación con el escaneo de índice completo del índice, tiene un límite de rango, por lo que es mejor que el índice. El rango es más fácil de entender, lo que debe recordarse es 出现了range,则一定是基于索引的. Al mismo tiempo, además de lo obvio entre, y y '>', '<', en yo también son escaneos de rango de índice.

4. ref.

La condición para la aparición de este tipo de conexión es: la columna de condición de búsqueda utiliza un índice y no es una clave principal y única .
De hecho, significa que aunque se utiliza el índice, el valor de la columna de índice no es único y habrá duplicación. De esta manera, incluso si el índice se usa para encontrar rápidamente los primeros datos, aún no se puede detener y se requiere un escaneo de rango pequeño cerca del valor objetivo.
Pero su ventaja es que no necesita escanear toda la tabla, porque el índice está ordenado, incluso si hay valores duplicados, se escanea en un rango muy pequeño.

5. ref_eq

¿La diferencia entre ref_eq y ref es que sabe que solo hay un conjunto de resultados de búsqueda de este tipo? ¡En qué circunstancias solo hay un conjunto de resultados! Ese es el caso en el que se utiliza la clave principal o el índice único para la búsqueda. Por ejemplo, para encontrar un estudiante en una escuela determinada de acuerdo con la identificación del estudiante, sabemos que debe haber un solo resultado antes de buscar, por lo que cuando encontramos el ID de estudiante por primera vez, la consulta se detuvo inmediatamente. Este tipo de conexión realiza consultas precisas cada vez sin escaneo excesivo, por lo que la eficiencia de búsqueda es mayor Por supuesto, la singularidad de la columna debe determinarse de acuerdo con la situación real.

6. const

En circunstancias normales, si se coloca una clave principal después de where como consulta condicional, el optimizador de mysql puede convertir la optimización de la consulta en una constante. En cuanto a cómo convertir y cuándo convertir, esto depende del optimizador.

Supongo que te gusta

Origin blog.csdn.net/Beyond_Nothing/article/details/114253664
Recomendado
Clasificación