Base de datos MySQL - Índice (2) - B + Árbol, estructura Hash, clasificación de índice (índice agrupado, índice secundario)

Tabla de contenido

Estructura del índice (2)

B+árbol

Picadillo

pensar

Clasificación del índice 

Clasificación del índice

Índice agrupado e índice secundario

Proceso de búsqueda

pensar


Estructura del índice (2)

B+árbol

B+Tree es una variante de B-Tree. Tomemos como ejemplo un árbol b+ con un grado máximo de 4 para ver su diagrama estructural:

Podemos ver dos partes:

  • La parte encerrada por círculos de puntos verdes es la parte citada, que solo sirve para indexar datos y no para almacenar datos.
  • La parte rodeada por círculos de puntos rojos es la parte de almacenamiento de datos y los datos específicos deben almacenarse en sus nodos hoja.

En otras palabras, en el árbol B, los datos almacenados se colocarán en el último nodo hoja.

De manera similar, podemos ir al sitio web de visualización de estructura de datos para demostrar:

https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html _

Inserte un conjunto de datos: 100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250.

Luego observe los cambios en los nodos durante la inserción de algunos datos.

Finalmente, encontramos que existen tres diferencias principales entre B+Tree y B-Tree:

  • Todos los datos aparecerán en los nodos de hoja.
  • Los nodos hoja forman una lista enlazada unidireccional.
  • Los nodos que no son hoja solo desempeñan la función de indexar datos y los datos específicos se almacenan en los nodos hoja.

La estructura que vimos arriba es la estructura de datos estándar B+Tree. A continuación, echemos un vistazo al
B+Tree optimizado en MySQL.

La estructura de datos del índice MySQL optimiza el clásico B+Tree. Sobre la base del árbol B + original, se agrega un puntero de lista vinculada que apunta al nodo de hoja adyacente para formar un árbol B + con un puntero de secuencia, lo que mejora el rendimiento del acceso a intervalos y facilita la clasificación.

Picadillo

Además de admitir índices B + Tree, MySQL también admite un tipo de índice: índice Hash.

estructura

El índice hash utiliza un determinado algoritmo hash para convertir el valor clave en un nuevo valor hash, lo asigna a la ranura correspondiente y luego lo almacena en la tabla hash.

Si dos (o más) valores clave se asignan a la misma ranura, tendrán un conflicto de hash (también llamado colisión de hash), que se puede resolver mediante una lista vinculada. 

 Esto es básicamente consistente con la tabla hash en la estructura de datos.

Características

  1. El índice hash solo se puede utilizar para comparación entre pares (=, in) y no admite consultas de rango (entre, >, <,...)
  2. No se puede utilizar el índice para completar la operación de clasificación
  3. La eficiencia de la consulta es alta (no hay conflicto de hash), generalmente solo se requiere una recuperación y la eficiencia suele ser mayor que el índice B + Tree.

Soporte del motor de almacenamiento

En MySQL, el motor de almacenamiento de memoria admite índices hash. InnoDB tiene una función hash adaptativa y el motor de almacenamiento InnoDB crea automáticamente el índice hash en función del índice B + Tree en condiciones específicas.

pensar

¿Por qué el motor de almacenamiento InnoDB elige utilizar la estructura de índice B + Tree?

1. En comparación con los árboles binarios, hay menos niveles y una alta eficiencia de búsqueda;
2. Para el árbol B, no importa si es un nodo hoja o un nodo no hoja, los datos se guardarán, lo que conducirá a una reducción en el
valores clave almacenados en una página y una disminución en los punteros, lo que requiere Guardar una gran cantidad de datos solo puede aumentar la altura del árbol, lo que resulta en un rendimiento reducido 3. En comparación
con el índice Hash, el árbol B + admite la coincidencia de rango y operaciones de clasificación.

Clasificación del índice 

Clasificación del índice

En la base de datos MySQL, los tipos específicos de índices se dividen principalmente en las siguientes categorías: índice de clave primaria, índice único, índice regular e índice de texto completo.

Clasificación significado Características Palabras clave
índice de clave primaria
Índice creado en la clave principal de la tabla.
Creado automáticamente por defecto , solo puede haber uno
PRIMARIO
índice único
Evite la duplicación de valores en una columna de datos en una misma tabla
Puede haber múltiples
ÚNICO
índice regular Localice rápidamente datos específicos Puede haber múltiples
Índice de texto completo La indexación de texto completo busca palabras clave en el texto en lugar de comparar valores en el índice. Puede haber múltiples TEXTO COMPLETO

Índice agrupado e índice secundario

En el motor de almacenamiento InnoDB, según la forma de almacenamiento del índice, se puede dividir en los dos tipos siguientes:

Clasificación significado Características
Índice agrupado
Al combinar el almacenamiento de datos y el índice, los nodos hoja de la estructura de índice almacenan datos de fila.
Debe haber , y solo uno.
Índice secundario
Almacene datos e índices por separado. Los nodos hoja de la estructura del índice están asociados con las claves primarias correspondientes.
Puede haber múltiples

Reglas de selección de índices agrupados:

  • Si existe una clave principal, el índice de clave principal es un índice agrupado.
  • Si no existe una clave principal, el primer índice único ( UNIQUE ) se utilizará como índice agrupado.
  • Si la tabla no tiene una clave principal o un índice único adecuado, InnoDB generará automáticamente un ID de fila como un índice agrupado oculto.

Las estructuras específicas de los índices agrupados y los índices secundarios son las siguientes:

podemos descubrir que:

  • El nodo hoja del índice agrupado cuelga los datos de esta fila.
  • El nodo hoja del índice secundario cuelga el valor de la clave principal correspondiente al valor del campo.

Proceso de búsqueda

A continuación, echemos un vistazo a cómo se ve el proceso de búsqueda específico cuando ejecutamos la siguiente declaración SQL :

El proceso específico es el siguiente:

  1. Dado que la consulta se basa en el campo de nombre, primero realizamos una búsqueda coincidente en el índice secundario del campo de nombre según nombre = 'Arm'. Sin embargo, solo el valor de clave principal 10 correspondiente a Arm se puede encontrar en el índice secundario.
  2. Dado que los datos devueltos por la consulta son *, en este momento, debe buscar en el índice agrupado el registro correspondiente a 10 de acuerdo con el valor de la clave principal 10 y, finalmente, encontrar la fila correspondiente a 10.
  3. Finalmente, puedes obtener los datos de esta fila y devolverlos directamente.

Consulta de tabla : este método de buscar primero datos en el índice secundario, encontrar el valor de la clave principal y luego obtener los datos en función del valor de la clave principal en el índice agrupado se denomina consulta de tabla.

pensar

¿Cuál de las siguientes dos declaraciones SQL es más eficiente? ¿Por qué?
A. seleccione * del usuario donde id = 10;
B. seleccione * del usuario donde nombre = 'Arm';
(Nota: id es la clave principal y el campo de nombre está indexado)

El rendimiento de ejecución de la declaración A es mayor que el de la declaración B.
Porque la declaración A va directamente al índice agrupado y devuelve datos directamente. La declaración B primero debe consultar el índice secundario del campo de nombre y luego
consultar el índice agrupado, lo que significa que se debe realizar una consulta de tabla .

 

¿Cuál es la altura del árbol B+ del índice de clave principal de InnoDB?

Supuesto:
el tamaño de una fila de datos es 1k y se pueden almacenar 16 filas de dichos datos en una página. Los punteros InnoDB ocupan 6 bytes de espacio
. Incluso si la clave principal es bigint, el número de bytes ocupados es 8.
La altura es 2:
n * 8 + (n + 1) * 6 = 16*1024, y se calcula que n es aproximadamente 1170

n se refiere al número de claves almacenadas actualmente; n*8 cuenta el número total de bytes ocupados por la clave principal; n+1 representa el número de punteros, un puntero más que la clave; 1 KB (K) = 1024 bits, todas las unidades son Se utiliza aquí Unificado a bits, por lo que 16 kb = 16 * 1024 bits, 16 significa 16 páginas,
1171 * 16 = 18736.
En otras palabras, si la altura del árbol es 2, se pueden almacenar más de 18,000 registros.
La altura es 3:
1171 * 1171 * 16 = 21939856.
En otras palabras, si la altura del árbol es 3, se pueden almacenar alrededor de 2200w de registros. 


FIN 


Aprenda de: Programador Dark Horse - Curso de base de datos MySQL

Supongo que te gusta

Origin blog.csdn.net/li13437542099/article/details/132916228
Recomendado
Clasificación