índice compuesto de mysql, índice abc hit

í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
Plan de implementación uno
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';

Plan de implementación dos
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' ;

Plan de implementación tres
Plan de implementación cuatro
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';

Inserte la descripción de la imagen aquí

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';

Inserte la descripción de la imagen aquí
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';

Inserte la descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/bgs_fly/article/details/108753335
Recomendado
Clasificación