MySQL (análisis InnoDB): --- Índice de árbol B + (índice agrupado y índice no agrupado (índice auxiliar)), división del índice de árbol B +

¡Hola a todos! Hoy es la víspera de Año Nuevo, ¡les deseo un año temprano! ¡Aquí, hermano mío, les deseo a todos los hermanos mayores reunión y armonía con sus familias, buena salud y buen trabajo en el nuevo año!

1. Descripción general del índice B + Tree

  • La esencia del índice del árbol B + es la realización del árbol B + en la base de datos. Sin embargo, el índice B + en la base de datos tiene una característica de alto abanico, por lo que en la base de datos , la altura del árbol B + generalmente está en el nivel 2 ~ 4, es decir, solo se necesitan 2 ~ 4 veces para buscar el registro de fila de un determinado valor de clave . Debido a que el disco mecánico general actual puede hacer al menos 100 veces IO por segundo, 2 ~ 4 veces IO significa que el tiempo de consulta es solo 0.02 ~ 0.04 segundos

El principio de funcionamiento general del árbol B +

  • Dejando a un lado varios detalles de implementación, hablemos sobre el principio de funcionamiento general del índice de árbol B +
  • El principio de funcionamiento es el siguiente :
    • Suponiendo que es una tabla de índice de clave primaria, hay ocho claves primarias de 0, 1, 2, 3, 4, 5, 6, 7 y 8 en una tabla
    • Luego, en el árbol B +, los nodos hoja almacenan estas claves primarias
    • Cuando seleccionamos * de la tabla donde id> 1 e id <7, primero comenzaremos desde el nodo raíz del árbol B + y miraremos hacia abajo. Después de encontrar el nodo 1, ya que los nodos subyacentes están organizados en una lista vinculada, el primario se busca la tecla a la derecha para encontrar los nodos 2, 3, 4, 5 y 6
    • insertar, actualizar, eliminar estos son el mismo principio

¿Cuál es la diferencia entre InnoDB y MyIASM B + tree?

  • Tanto InnoDB como MyIASM admiten índices de árbol B +, entonces, ¿cuál es la diferencia entre ellos?
    • InnoDB : su nodo hoja almacena no solo el valor de la clave principal, sino también los datos de fila correspondientes a la clave principal. Por lo tanto, cada nodo hoja = clave principal + fila completa de valores de datos
    • MyIASM : Su nodo hoja también almacena el valor de la clave primaria, pero no almacena los datos de fila correspondientes a la clave primaria y almacena la dirección correspondiente a los datos de fila. Cuando encontramos el valor de la clave principal, encontramos el valor en la dirección correspondiente a través del puntero

Pregunta de la entrevista: MyIASM e InnoDB manipulan datos a través del índice numérico B +, ¿cuál es más rápido?

  • Las reglas son :
    • Cuando la cantidad de datos para operar no es mucha, puede que no haya diferencia entre los dos
    • Cuando la cantidad de datos es grande, InnoDB es más rápido que MyIASM
  • La explicación es la siguiente :
    • InnoDB lee datos del disco y construye un árbol B + en la memoria Dado que los nodos hoja del árbol B + almacenan el valor de los datos, los datos se almacenan directamente en la memoria.
    • MyIASM lee datos del disco y construye un árbol B + en la memoria, ya que su nodo de hoja del árbol B + solo almacena los punteros correspondientes a los datos y no almacena el valor, no leerá los datos en la memoria.
    • Entonces, cuando la cantidad de datos es pequeña, no hay diferencia entre los dos: debido a que la cantidad de datos es pequeña, InnoDB obtiene datos directamente de la memoria y MyIASM usa punteros para encontrar datos en el disco, y la eficiencia no es mucha. diferente.
    • Cuando la cantidad de datos a operar es grande, InnoDB obtiene los datos directamente de la memoria, por lo que la velocidad es más rápida, pero MyIASM necesita usar constantemente el puntero para obtener los datos del disco, lo que resulta en una velocidad más lenta.

Clasificación del índice de árbol B +

  • Dividido en:
    • Índice agrupado (índice agrupado) : según la clave principal de cada tabla para construir un árbol B +, una tabla solo puede tener un índice agrupado
    • Índice auxiliar (índice secundario) : según el árbol B + de la estructura de clave no principal, una tabla puede tener varios índices auxiliares
  • Ya sea un índice agrupado o auxiliar, su interno es el árbol B +, es decir , los nodos hoja altamente equilibrados almacenan todos los datos
  • La diferencia entre un índice agrupado y un índice auxiliar es si el nodo hoja almacena una fila completa de información

En segundo lugar, el índice agrupado

Estructura de índice agrupado

  • Como se mencionó anteriormente, InnoDB es una tabla organizada por índices, es decir, los datos de la tabla se almacenan en el orden de la clave principal.
  • El índice agrupado es para construir un árbol B + de acuerdo con la clave principal de cada tabla , y los datos del registro de fila de toda la tabla se almacenan en los nodos hoja , y los nodos hoja del índice agrupado también se denominan páginas de datos . Esta característica del índice agrupado determina que los datos de la tabla organizada por índice también forman parte del índice. Al igual que la estructura de árbol B +, cada página de datos está vinculada a través de una lista doblemente vinculada
  • Dado que las páginas de datos reales solo se pueden ordenar de acuerdo con un árbol B +, cada tabla solo puede tener un índice agrupado
  • En la mayoría de los casos, el optimizador de consultas tiende a utilizar un índice agrupado . Porque el índice agrupado puede encontrar datos directamente en los nodos hoja del índice del árbol B +. Además, debido a que el orden lógico de los datos está definido, el índice agrupado puede acceder a consultas de valores de rango de manera particularmente rápida. El optimizador de consultas puede encontrar rápidamente que es necesario escanear un cierto rango de páginas de datos

Caso de análisis de estructura de árbol B +

  • Cree una tabla a continuación, de modo que cada página solo pueda almacenar dos filas de registros
create table t(
    a int not null,
    b varchar(8000),
    primary key(a)
)engine=innodb;
  • Insertar datos , la longitud de la columna insertada b es 7000, por lo que puede hacer artificialmente que cada página solo pueda almacenar dos filas en la actualidad
insert into t select 1,repeat('a',7000);
insert into t select 2,repeat('a',7000);
insert into t select 3,repeat('a',7000);
insert into t select 4,repeat('a',7000);
  • Utilice la herramienta py_innodb + page_info para analizar el espacio de la tabla, puede obtener :
    • El nivel de página de 0000 es la página de datos. La página de datos se analizó en el capítulo anterior. Ahora no nos centramos en esta parte.
    • La página con el nivel de página 0001, la altura actual del árbol B + es 2, por lo que esta página es la raíz del árbol B +

  • Observe los datos almacenados en la página raíz de la causa a través de la herramienta hexdump, y luego analice esta página a través del Directorio de páginas al final de la página :
    • Puede saber desde 00 63 : dónde comienza la línea en la página
    • Luego use el encabezado del registrador para analizar :
      • El valor a partir de 0xc063 es 69 6e 66 69 6d 75 6d 00, lo que significa que infimum es un registro de fila
      • Los 5 bytes anteriores 01 00 02 00 1b es el encabezado del registrador. El análisis del valor 1 del 4 al 8 bit significa que solo hay un registro en la fila de registros (debe recordarse que el directorio de páginas de InnoDB es escaso ), que es un registro mínimo en sí
      • Utilice los dos últimos bytes del encabezado del registrador 00 1b para determinar la posición del siguiente registro, es decir, c063 + 1b = c07e, lea el valor de la clave para obtener 80 00 00 01, que es el valor de la clave principal de 1 (el int es Unsigned, por lo que el binario es 0x80 00 00 01, no 0x0001)
    • El valor 00 00 00 04 después de 80 00 00 01 representa el número de página que apunta a la página de datos
    • De la misma manera, puede encontrar los dos valores clave de 80 00 00 02 y 80 00 00 04 y la página de datos a la que apuntan.

  • A través del análisis anterior de los nodos de la página sin datos, se puede encontrar que la página de datos almacena un registro completo de cada fila , mientras que en la página de índice de la página sin datos, solo el valor clave y el desplazamiento a la página de datos se almacenan en lugar de un registro de línea completo. Por lo tanto, la estructura de este índice agrupado es aproximadamente como se muestra en la figura siguiente.

El almacenamiento del índice agrupado no es físicamente continuo

  • Muchos documentos de bases de datos y blogs en línea dicen que el índice agrupado almacena físicamente los datos en orden. Como puede verse en la figura anterior, si el índice agrupado debe almacenar registros físicos en un orden específico, el costo de mantenimiento parece ser muy limitado.
  • Por lo tanto, el almacenamiento del índice agrupado no es físicamente continuo, sino lógicamente continuo.
  • Hay dos puntos :
    • Una es que las páginas mencionadas anteriormente están conectadas por una lista doblemente enlazada, y las páginas están ordenadas en el orden de la clave principal.
    • Otro punto es que los registros en cada página también se mantienen a través de una lista doblemente enlazada, y el almacenamiento físico tampoco se puede almacenar de acuerdo con la clave primaria.

 

 

Ventajas de la "consulta rápida" del índice agrupado

  • Otra ventaja del índice agrupado es que es muy rápido para la búsqueda de clasificación de clave primaria y la búsqueda de rango, y los datos de los nodos hoja son los datos que el usuario desea consultar.
  • Si el usuario necesita consultar una tabla de usuarios registrados, consultar los últimos 10 usuarios registrados , debido a que el índice del árbol B + es una lista doblemente enlazada, el usuario puede encontrar rápidamente la última página de datos y recuperar 10 registros. Si usa EXPLAIN para el análisis, puede obtener:
    • Aunque ordenar por se utiliza para ordenar los registros aquí, la llamada operación de ordenación de archivos no se realiza en el proceso real , y esto se debe a las características del índice agrupado.

  • La otra es la consulta de rango , es decir, si desea encontrar datos en un cierto rango de la clave principal, puede obtener el rango de página a través del nodo intermedio superior del nodo hoja y luego leer la página de datos directamente . Otro ejemplo:
    • La ejecución de Explique obtiene el plan de ejecución de la base de datos MySQL , y en la columna de filas se proporciona un número estimado de filas devueltas del resultado de la consulta. Cabe señalar que las filas representan un valor estimado, no un valor exacto. Si realmente ejecuta esta consulta SQL, puede ver que en realidad solo hay 9946 filas de registros

 

Tres, índice auxiliar (índice no agrupado)

Estructura de índice auxiliar

  • El índice secundario (índice secundario) también se denomina índice no agrupado, el nodo hoja no contiene todos los datos del registro de fila.
  • Los nodos de hoja además contienen clave , cada nodo de hoja en la línea de índice también incluye un marcador (Marcador) . Este marcador se utiliza para indicarle al motor de almacenamiento InnoDB dónde encontrar los datos de la fila correspondiente. Dado que la tabla del motor de almacenamiento InnoDB es una tabla organizada por índices, el marcador del índice auxiliar del motor de almacenamiento InnoDB es la clave de índice agrupado de los datos de la fila correspondiente.
  • La siguiente figura muestra la relación entre el índice auxiliar y el índice agrupado en el motor de almacenamiento InnoDB:

principio de funcionamiento

  • La existencia de índices auxiliares no afecta la organización de los datos en el índice agrupado, por lo que puede haber múltiples índices auxiliares en cada tabla.
  • Al buscar datos a través del índice auxiliar, el motor de almacenamiento InnoDB atraviesa el índice auxiliar y obtiene la clave principal al índice de clave principal a través del puntero de nivel de hoja , y luego encuentra un registro de fila completo a través del índice de clave principal.
  • Por ejemplo : si busca datos en un árbol de índice auxiliar con una altura de 3, debe recorrer el árbol de índice auxiliar 3 veces para encontrar la clave primaria especificada. Si la altura del árbol de índice agrupado también es 3, entonces También es necesario realizar 3 búsquedas del árbol de índice agrupado, y finalmente encontrar una página donde se encuentran los datos de la fila completa, por lo que se requieren un total de 6 accesos de E / S lógicos para obtener la página de datos final

Análisis de la estructura del índice auxiliar

  • Tome la tabla t anterior como ejemplo y luego agregue otra columna
create table t(
    a int not null,
    b varchar(8000),
    primary key(a)
)engine=innodb;

 

alter table t add c int not null;
  • Actualice el valor de la columna c recién agregada para cada fila
  • update t set c=0-a;

     

  • Cree un índice no agrupado en la columna c
alter table t add key idx_c(c);
  • Ver el índice actual

  • Consulta los datos de la tabla actual.

  • Con la herramienta py_innodb_page_info para analizar el espacio de tabla, puede obtener:

  • En comparación con el índice agrupado anterior, esta vez hay una página más. Analice la página cuyo desplazamiento de página es 4, que es la página donde se encuentra el índice no agrupado, y se puede obtener analizando la herramienta hexdump:

Dado que solo hay 4 filas de datos y la columna c tiene solo 4 bytes, se puede completar en una página de índice no agrupada. El análisis y el análisis se pueden obtener como se muestra en la siguiente figura. La siguiente figura muestra la tabla t índice auxiliar idx_c y relación de índice agrupado:

  • Puede ver que el nodo hoja del índice auxiliar contiene el valor de la columna c y el valor de la clave primaria
  • Debido a que aquí establecemos deliberadamente el valor clave en un valor negativo, encontraremos que -1 se almacena internamente en la forma de 7f ff ff ff
  • 7 (0111) El bit más alto es 0, que representa un valor negativo. El valor real debe invertirse y luego sumarse 1, es decir, -1

Cuarto, la división del índice del árbol B +

  • La división del índice del árbol B + es diferente de la operación de inserción del número B + . La división de la página del índice del árbol B + no siempre comienza desde el registro central de la página , lo que puede generar una pérdida de espacio en la página.

Descripción de la demostración

  • La inserción se realiza según el orden de incremento, si se insertan 10 registros en este momento

  • Si desea insertar registros más tarde y necesita operaciones de paginación, el registro 5 se utilizará como punto de división y las dos páginas siguientes se obtendrán después de la división.

  • Sabemos que se insertan secuencialmente durante la inserción, por lo que no se insertarán más registros en la página P1, lo que resultará en una pérdida de espacio, y P2 se dividirá nuevamente
  • El encabezado de página del motor de almacenamiento InnoDB tiene las siguientes partes para guardar la información de secuencia insertada :
    • PAGE_LAST_INSERT

    • PAGE_DIRECTION

    • PAGE_B_DIRECTION

  • Con esta información, el motor de almacenamiento InnoDB puede decidir si dividir hacia la derecha o hacia la izquierda, y al mismo tiempo decidir cuál registrar el punto de división como
    • Si la inserción es aleatoria, el registro del medio de la página se toma como registro del punto de división, que es el mismo que en la introducción anterior.
    • Si el número de registros insertados en la misma dirección es 5, y el registro que se ha ubicado (cursor) está ubicado actualmente (en InnoDB, el primero debe ubicarse, el registro ubicado es el registro anterior del registro a insertar ) y hay 3 registros, entonces el registro del punto de división es el tercer registro después del registro ubicado; de lo contrario, el registro del punto de división es el registro que se insertará

Caso de demostración

  • Ahora mire un ejemplo de división a la derecha, y hay 3 registros después del registro ubicado, el registro del punto de división se muestra en la siguiente figura:

  • La imagen de arriba está dividida a la derecha y hay 3 registros después del registro ubicado, el registro dividido es el registro del punto de división y finalmente se divide a la derecha para obtener la situación que se muestra en la figura siguiente.

Caso de demostración

  • En el caso de demostración anterior, el punto de división es el registro de inserción en sí. Después de dividir hacia la derecha, solo se inserta el registro en sí. Esta es una situación común en la inserción de incremento automático.

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_46405589/article/details/113788256
Recomendado
Clasificación