índice conjunto de mysql, práctica controvertida abc
Razón :
Hubo una controversia al discutir las preguntas de la entrevista del índice conjunto mysql con mis colegas. La pregunta principal es: los tres campos de a, byc se utilizan como un índice conjunto, b, c; ¿y los casos de ayc llegarán al índice?
Revisé los blogs relevantes en línea y descubrí que muchas respuestas eran diferentes, así que simplemente experimenté con mis manos. La versión de mysql que utilicé es 5.6
Uno: crea una mesa
Para ajustar las preguntas de la entrevista de manera más directa, los campos están representados directamente por AA, BB, CC
create table IF NOT EXISTS TEST_COMPOSITE_INDEX
(
`TID` BIGINT NOT NULL AUTO_INCREMENT,
`AA` VARCHAR(50) NOT NULL DEFAULT '' ,
`BB` VARCHAR(50) NOT NULL DEFAULT '',
`CC` VARCHAR(50) NOT NULL DEFAULT '',
`DD` VARCHAR(50) NOT NULL DEFAULT '',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`TID`),
KEY `index_comp` (`AA`,`BB`,`CC`)
)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;
En sql, tenemos dos índices, uno: la clave principal TID, dos: el índice combinado compuesto por AA, BB y CC: index_comp
Dos: insertar datos
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A1','B1','C1','D1');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A2','B2','C2','D2');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A3','B3','C3','D3');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A4','B4','C4','D4');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A5','B5','C5','D5');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A6','B6','C6','D6');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A7','B7','C7','D7');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A8','B8','C8','D8');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A9','B9','C9','D9');
insert into TEST_COMPOSITE_INDEX (AA,BB,CC,DD)VALUE('A10','B10','C10','D10');
Tres: Ver el plan de ejecución
Observamos respectivamente los siguientes planes de ejecución:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.tid='3' ;
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA='A1';
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.BB='B1';
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.CC='C1' ;
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA='A1' AND tci.CC='C1';
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.BB='B1' AND tci.CC='C1';
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA='A1' AND tci.BB='B1';
Los siguientes resultados se muestran en orden, veámoslos uno por uno:
La primera: la
primera consulta que usa la clave principal, puede ver que la clave principal se usa en el plan de ejecución y el número de filas escaneadas es 1, lo cual es muy eficiente.
el segundo:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA='A1';
Puede ver que el índice también se usa, esta vez el índice conjunto que creamos: index_comp. Tenga en cuenta que key_len: el número de bytes usados por el índice, esto se usará para comparar más adelante
El tercero y cuarto:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.BB='B1';
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.CC='C1' ;
Utilice únicamente el campo BB o CC, y no utilizará el índice, el número de líneas de exploración es 10
el quinto:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA='A1' AND tci.CC='C1';
Aquí hay un punto en el que tenemos una disputa. Puede ver que el índice se usa, pero la cantidad de bytes usados por el índice key_len es 152 y la segunda declaración solo usa A para consultar, la cantidad de bytes usados es la misma, así que esta oración La conclusión es: aunque el índice se usa al consultar A y C, solo se usa realmente A, no AC
sexto:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.BB='B1' AND tci.CC='C1';
Obviamente, los índices no se utilizan al consultar B y C
el séptimo
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA='A1' AND tci.BB='B1';
El último es el índice conjunto normal, que sigue a la coincidencia más a la izquierda. El número de bytes utilizados por el índice: 304, que es exactamente el doble del resultado anterior de un solo campo.
Finalmente, explique los problemas que se pueden encontrar en la entrevista:
Si es un índice compuesto, y se sigue la coincidencia más a la izquierda, si uno de los campos es una consulta de rango, entonces: el campo de respuesta solo irá a la consulta de rango de ese campo, por ejemplo:
EXPLAIN select * FROM TEST_COMPOSITE_INDEX tci where tci.AA>'A1' AND tci.BB='B1';
entonces el campo de índice usado en esta consulta es solo: AA, pero no usado cama y desayuno