# 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
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
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
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
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:
* 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';