Siete escenarios comunes de fallas de índice en el índice compuesto de MySQL


# Descripción de la base de datos La tabla emp utilizada es la siguiente:

CREATE TABLE emp(
	id INT(11) NOT NULL AUTO_INCREMENT,
	empno INT NOT NULL,
	NAME VARCHAR(20) DEFAULT NULL,
	age INT(3) DEFAULT NULL,
	deptid INT(11) DEFAULT NULL,
	PRIMARY KEY (id)
)
ENGINE = INNODB AUTO_INCREMENT=1 DEFAULT CHARSET =utf8;

Luego inserte aleatoriamente 500,000 piezas de datos en él

Intente construir un índice compuesto en el orden de age_name_deptid y consulte la ejecución

CREATE INDEX idx_age_name_deptid ON emp(age, NAME, deptid);

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`age`=30
AND emp.name='abcd'
AND emp.`deptid`=4;

Los resultados son los siguientes: Lo
Inserte la descripción de la imagen aquí
anterior es el uso normal del índice, se puede ver que después de que se usa el índice, la fila física se reduce de 500000 a 1, lo que mejora la eficiencia. Aquí hay siete escenarios de falla de índice basados ​​en esto

**


1. Caso 1 Falta el elemento de la consulta en la primera posición.


**

CREATE INDEX idx_age_name_deptid ON emp(age, NAME, deptid);

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE  emp.name='abcd' AND emp.`deptid`=4;

Los resultados son los siguientes: las
resultado de búsqueda
filas de la fila física están cerca de 500000 y se puede ver que el resultado de la consulta es una consulta de tabla completa


2. Caso 2 Interrupción del índice, el índice después de la interrupción no es válido

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.`deptid`=4;

Los resultados son los siguientes: Se
Inserte la descripción de la imagen aquí
puede ver que aunque las filas físicas de la consulta se han reducido a más de 40.000, es más eficiente que un escaneo de tabla completo, pero peor que en el mejor de los casos. Esto se debe a que el orden del índice establecido es age_name_deptid, y esta consulta es age_deptid, se interrumpe en el nombre y el índice después de la interrupción deja de ser válido.

3. Caso 3 Utilice una función en la columna de índice

CREATE INDEX idx_name ON emp(NAME);

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.`name` LIKE 'abc%';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE LEFT(emp.`name`,3) = 'abc';

El primer resultado de la consulta El

segundo resultado de la consulta
Inserte la descripción de la imagen aquí

4. Escenario 4 El motor de almacenamiento no puede usar la columna a la derecha de la condición de rango en el índice **

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.`deptid`=4 AND emp.name='abcd';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.`deptid`>=4 AND emp.name='abcd';

5. Escenario 5: el índice no se puede utilizar cuando se produce una desigualdad

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE  emp.`deptid`=4;

CREATE INDEX idx_deptid ON emp(deptid);

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE  emp.`deptid`=4;
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE  emp.`deptid`<>4;

Los resultados son los siguientes:
Inserte la descripción de la imagen aquí

* 6. En caso de que 6 no sea nulo, no se puede usar el índice, pero es nulo se puede usar el índice.

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age IS NULL;
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age IS NOT NULL;

7. El índice no es válido en el caso 7 como '% xxx' *

EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE NAME LIKE 'abc';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE NAME LIKE 'abc%';
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE NAME LIKE '%abc';

Supongo que te gusta

Origin blog.csdn.net/vivian233/article/details/109801868
Recomendado
Clasificación