Introducción detallada a la estructura de datos subyacente del índice Mysql

La naturaleza del índice

Índice es para ayudar a Mysql acceso eficiente a los datos ordenados la estructura de datos .

estructura de datos

Árbol binario rojo árbol negro Tabla hash B-Tree B + Tree

Árbol binario

Si la base de datos no está indexada, los datos de la consulta se compararán fila por fila para obtener los datos consultados, de modo que si la cantidad de datos en la consulta aumenta cada vez más, el tiempo consumido será cada vez más largo.

Como se muestra en la figura siguiente, Col2 se utiliza como columna de índice. Solo se necesitan dos veces para obtener el índice de 89 para obtener Col2 = 89, ubicar los datos y obtenerlos. Si no usa el índice, debe comparar 6 veces fila por fila para obtenerlo.
Inserte la descripción de la imagen aquí
La capa inferior de Mysql no utiliza la estructura de datos de árbol binario como índice. Si se usa Col1 como columna de índice, la estructura de datos del árbol binario se muestra en la siguiente figura. Si desea obtener los datos, incluso si pasa por el índice, necesita 6 búsquedas, lo cual no es una gran optimización para la eficiencia. La indexación no ayuda mucho a mejorar la eficiencia.
Inserte la descripción de la imagen aquí

Árbol negro rojo

La estructura de datos del árbol rojo-negro en la figura siguiente parece resolver el problema del crecimiento unilateral del árbol binario. El índice 6 se puede obtener con solo consultar 3 veces. Pero esta no es la mejor solución. La cantidad actual de datos no es grande. Si la cantidad de datos alcanza varios millones, decenas de millones, la altura del árbol rojo-negro aumentará cada vez más. Por ejemplo, la altura del árbol = 18, luego consulte un fragmento de datos Requiere 18 E / S de disco y la eficiencia no es muy alta.
Inserte la descripción de la imagen aquí

Árbol B

  • Los nudos de las hojas tienen la misma profundidad.
  • No todos los índices se repiten.
  • Los índices de los nodos están ordenados de izquierda a derecha.

Inserte la descripción de la imagen aquí

Árbol B + (variante B-Tree)

La estructura de datos utilizada por Mysql

  • Los nodos no hoja no almacenan datos, solo índices, que pueden liberar espacio para almacenar más índices.
  • El nodo hoja contiene todos los campos de índice.
  • Los nodos hoja están conectados por punteros para mejorar el rendimiento del acceso a intervalos.

Declaración de consulta: muestra variables como'innodb_page_size '
Un nodo no hoja puede almacenar 16384 bytes por defecto, que son 16 KB. Por ejemplo, un índice ocupa 8 bytes y la siguiente dirección de archivo de índice ocupa 6 bytes. 16384 dividido por 8 más 6 es igual a 1170, lo que significa que un nodo no hoja puede almacenar aproximadamente 1170 elementos de índice. Pero los nodos hoja necesitan almacenar elementos de datos, y la asignación de 1 KB es suficiente, es decir, un nodo hoja puede almacenar 16 elementos. De esta forma, si la altura del árbol es 3, los datos que se pueden almacenar es igual a 1170 por 1170 por 16 igual a más de 20 millones. En otras palabras, más de 20 millones de discos de datos io pueden obtener los datos que desea tres veces.
Inserte la descripción de la imagen aquí

Picadillo

  • Realice un cálculo hash en la clave de índice para localizar la ubicación de los datos.
  • El rendimiento de hash es a menudo más eficiente que el índice B + Tree.
  • Pero no admite la búsqueda de rango

Inserte la descripción de la imagen aquí

¿Por qué Mysql elige B + Tree en lugar de B-Tree?

  • B + Tree mueve todos los elementos de datos en los nodos que no son hojas del B-Tree a los nodos hoja, liberando más espacio para almacenar los elementos del índice, por lo que la altura del árbol es solo 3 cuando se almacenan los 20 millones de datos. Si usa B-Tree Almacene 20 millones de datos, la altura del árbol es mucho mayor que 3
  • Los nodos de hojas de árbol B + también tienen asociaciones de punteros. Para búsquedas de rango como id> 15, se ubicará en 15 y luego obtendrá los siguientes datos de acuerdo con el puntero para mejorar el rendimiento del acceso de intervalo.

Implementación del índice del motor de almacenamiento MyISAM (no agrupado)

Inserte la descripción de la imagen aquí

Implementación del índice del motor de almacenamiento InnoDB (agregación)

Inserte la descripción de la imagen aquí
Índice secundario El
elemento de datos del índice secundario almacena el valor de la clave principal y luego regresa a la tabla de acuerdo con la identificación de la clave principal.Inserte la descripción de la imagen aquí

Estructura conjunta de almacenamiento de índices

Inserte la descripción de la imagen aquí

  • El principio del prefijo más a la izquierda del índice

URL de visualización de la estructura de datos: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

Supongo que te gusta

Origin blog.csdn.net/weixin_51049616/article/details/108795342
Recomendado
Clasificación