El costo de la tabla de retorno del índice de árbol B+ (10)

¡Trabajar juntos para crear y crecer juntos! Este es el día 27 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de agosto", haga clic para ver los detalles del evento

El costo de la tabla de retorno del índice de árbol B+ (10)

prefacio

¿Qué es un formulario de devolución?

La operación de devolución de tabla generalmente ocurre en el índice secundario, y las columnas de consulta no están todas incluidas en el índice secundario. Es necesario consultar los datos de usuario completos en el índice agrupado de acuerdo con la identificación de la clave principal en el nodo hoja del índice secundario. índice Este proceso de consulta se llama tabla de retorno.

Si hay una tabla de prueba person_info

CREATE TABLE person_info(
    id INT NOT NULL auto_increment,
    name VARCHAR(100) NOT NULL,
    birthday DATE NOT NULL,
    phone_number CHAR(11) NOT NULL,
    country varchar(100) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_name_birthday_phone_number (name, birthday, phone_number)
);
复制代码

Al mismo tiempo, el índice secundario también se denomina índice compuesto.La estructura del índice de datos idx_name_birthday_phone_number es la siguiente

imagen-20220823193512122.png

El nodo de hoja B+ contiene nombre, cumpleaños, número de teléfono, id pero no contiene la columna de país, si existe el siguiente SQL

select country,name,birthday from person_info limit 10;
复制代码

Las columnas de nombre y cumpleaños se pueden obtener directamente a través del nodo de hoja del índice combinado idx_name_birthday_phone_number, y el país debe obtenerse de la identificación de la clave principal al árbol del índice de la clave principal. El proceso de obtener la información de la columna del país se denomina retorno mesa.

costo de devolución

Otro ejemplo es el siguiente SQL

select * from person_info where name > 'Asa' and name < 'Barlow';
复制代码

Debido a que la columna de consulta es todo sql, obviamente es necesario volver a la tabla, pero aquí se deben mencionar dos conceptos de E/S aleatoria y E/S secuencial.

Dado que existe un índice compuesto idx_name_birthday_phone_number, los nombres se organizan en orden y, de acuerdo con las condiciones nombre > 'Asa' y nombre < 'Barlow' , la probabilidad de tomar los datos en el medio es un espacio continuo, por lo que podemos obtener una página de datos o varias Una página de datos puede obtener datos rápidamente, este proceso de lectura de datos del disco se denomina E/S secuencial .

Nuestro índice secundario no contiene la columna del país, por lo que debemos consultar el registro completo nuevamente en el índice desglosado en función de todas las identificaciones de registro en el rango de nombre > 'Asa' y nombre < 'Barlow' , y la identificación puede ser aleatoria asignado a diferentes páginas de datos, la dificultad de la consulta es mucho mayor que la consulta del valor de la columna de nombre, este método de lectura se llama IO aleatorio .

En la mayoría de los casos, el rendimiento de E/S secuencial es mucho mayor que el de E/S aleatoria.

Por lo tanto, de acuerdo con los pasos del análisis, podemos obtener dos características al usar la consulta de índice combinado

  • La consulta utilizará dos índices, uno es un índice compuesto y el otro es un índice agrupado.

  • La E/S secuencial generalmente se usa para acceder a índices compuestos, y la E/S aleatoria generalmente se usa para acceder a índices agrupados.

Es decir, cuanto mayor sea la cantidad de datos devueltos a la tabla, menor será la eficiencia de usar el índice compuesto, si los datos en el rango de **nombre > 'Asa' y nombre < 'Barlow'** ocupan más que el 90% de los datos de la tabla completa, entonces es mejor usar un escaneo de tabla completo, entonces, ¿cuándo usar un escaneo de tabla completo y cuándo usar una consulta de índice? Esto depende del optimizador, y el optimizador se refiere a la cantidad de registros devueltos a la tabla.

Entonces, si el SQL anterior está escrito de la siguiente manera

select * from person_info where name > 'Asa' and name < 'Barlow' limit 10;
复制代码

Reduciendo el número de retornos de tabla, el optimizador natural estará más inclinado a la operación de índice secundario (índice combinado) + retorno de tabla.

Cómo evitar formularios atrasados

Sabiendo el costo de volver a la tabla, necesitamos saber cómo evitarlo, la razón del análisis anterior de volver a la tabla es porque la columna de consulta no está completamente entre las columnas de índice, por lo que necesitamos consultar nuevamente en el índice agrupado de acuerdo con la identificación de la clave principal. De acuerdo con esta razón, podemos usar la cobertura del índice para resolver este problema

De la siguiente manera, aunque no hay límite límite, el índice compuesto idx_name_birthday_phone_number contiene todas las columnas de la consulta, por lo que puede lograr el propósito sin volver a la tabla nuevamente.

select name, birthday, phone_number from person_info 
where name > 'Asa' and name < 'Barlow';
复制代码

A través del análisis anterior, sabemos que la columna de consulta afectará la consulta del índice compuesto, por lo que tratamos de no usar una sintaxis similar a **select ** y necesitamos especificar explícitamente la columna de consulta.

Supongo que te gusta

Origin juejin.im/post/7136202381334675486
Recomendado
Clasificación