Cuando usamos una consulta difusa para agregar un índice a SQL, debe agregarse a la derecha del campo, no a la izquierda oa ambos lados del campo, porque al hacerlo, todos serán inválidos, entonces, ¿cómo podemos agregarlos a ambos lados?
Primer ejemplo: la
siguiente figura es una tabla de base de datos
CREATE TABLE `tbl_user`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`age`INT(11) DEFAULT NULL,
`email` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('1aa1',21,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('2bb2',23,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('3cc3',24,'[email protected]');
INSERT INTO tbl_user(`name`,`age`,`email`)VALUES('4dd4',26,'[email protected]');
Agregue índices a los campos de nombre y edad:
CREATE INDEX idx_user_nameAge ON tbl_user(NAME,age)
Luego usamos explicar para probar:
Prueba 1: Consulta *
EXPLAIN SELECT * FROM tbl_user WHERE NAME LIKE '%aa%';
Prueba 2: Índice de cobertura
EXPLAIN SELECT id,NAME,age FROM tbl_user WHERE NAME LIKE '%aa%';
Aquí podemos ver que el índice no es inválido, y el uso de algunos de los tres campos anteriores no causará invalidación.
Prueba 3: Agregue otros campos, aquí no agregamos un índice al correo electrónico
EXPLAIN SELECT id,NAME,age,email FROM tbl_user WHERE NAME LIKE '%aa%';
Podemos ver que el índice no es válido.
Por lo tanto, para resolver la consulta difusa, agregue% en ambos lados y el índice no es inválido, luego necesitamos cubrir el índice cuando consultamos, es decir, como en la prueba 2 anterior, por lo que tratamos de agregar índices a los campos que deben consultarse, y luego El uso de un índice de cobertura no hará que el índice deje de ser válido.