Resumen de aprendizaje avanzado de Mysql 6: el concepto y la comprensión de los índices, la explicación detallada del proceso de generación del árbol B+, la comparación entre MyISAM e InnoDB

1. Introducción del índice

1.1 Por qué usar índices

He aprendido mucho sobre la sintaxis de sql antes, ahora necesito entender que hemos ingresado una declaración de consulta seleccionada, ¿ cómo encuentra mysql los datos correspondientes a la declaración de consulta ? Además, ¿cómo lo encontraste rápidamente?

Aquí podemos introducir el concepto de índice: un índice es una estructura de datos utilizada por el motor de almacenamiento para encontrar rápidamente registros de datos .

No sé si puede ver claramente el concepto anterior, ¡ el índice es una estructura de datos !

1.2 Buscar registros de datos

A continuación, a través de ejemplos, para entender lentamente, el índice es una estructura de datos, qué significa exactamente...

Por ejemplo, en este momento, tenemos una tabla de empleados. Después de ingresar la declaración de selección, ¿cómo debemos encontrar estos datos? Analicémoslo a continuación.

select * from employees where employee_id=100;

inserte la descripción de la imagen aquí

Primero, cree una tabla index_demo más simple. Solo hay 3 campos en esta tabla: c1, c2, c3, y el campo c1 es la clave principal.

CREATE TABLE index_demo(
    c1 int,
    c2 int,
    c3 char(1),
) ROW_FORMAT = Compact;

El formato de fila utilizado aquí es Compacto, que es el formato en el que se guarda realmente cada fila de datos :

  1. record_type : un atributo de la información del encabezado del registro, que indica el tipo de registro. 0 significa registro normal, 1 significa registro de directorio, 2 significa registro mínimo, 3 significa registro máximo .
  2. next_record : un atributo de la información del encabezado del registro, que indica el desplazamiento de la dirección de la siguiente dirección en relación con este registro.
  3. El valor de cada columna: aquí solo se registran tres columnas en index_demo, a saber, c1, c2, c3.
  4. Otra información: Toda la información excepto los tres tipos de información anteriores, incluidos los valores de otras columnas ocultas y la información adicional registrada.

inserte la descripción de la imagen aquí

1.3 Insertar datos, búsqueda en varias páginas

Después de crear la tabla, comience a insertar datos y comience a buscar, primero inserte 3 datos:

INSERT INTO index_demo VALUES 
(1, 4, 'u'),
(3, 9, 'd'),
(5, 3, 'y');

Mysql carga los registros de datos en el disco por páginas, y el tamaño de una página es de 16 KB , por lo que podemos cargar hasta 16 KB de datos una vez que lo cargamos.

Aunque solo insertamos 3 piezas de datos, suponiendo que las 3 piezas de datos hayan alcanzado los 16 KB, entonces se puede llenar una página, como se muestra a continuación:
inserte la descripción de la imagen aquí

Se puede ver que en este momento, los datos se concatenan en una lista enlazada unidireccional en una página según el tamaño de la clave principal (c1). Si desea encontrar un dato, puede buscar secuencialmente en esta página.

Dado que estos tres datos ya han llenado una página, si se inserta otro dato en este momento, la dirección de una página se reasignará para almacenar el nuevo registro de datos. Después del almacenamiento, dado que ordenamos por la clave principal, debemos verificar si es necesario mover el registro. Si es necesario mover el registro, debe moverse de acuerdo con el tamaño de la clave principal. Este proceso se llama paginación _

Por ejemplo, se inserta otro dato en este momento. Luego, debe mover el registro con el valor de clave principal de 5 a una página 28 recién asignada y luego insertar el registro con el valor de clave principal de 4 en la página 10.

INSERT INTO index_demo VALUES 
(4, 4, 'a');

inserte la descripción de la imagen aquí

Bueno, con el aumento de los registros de la base de datos, más y más páginas se asignarán en la base de datos, más o menos como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
1) Dado que cada página puede no ser continua en el disco, entre cada página La lista doblemente enlazada conexión utilizada.
2) En cuanto a cada página, debido a la lenta velocidad de consulta de la lista enlazada individualmente, se puede mantener una matriz para registrar la dirección de cada dato. Si necesita consultar, puede encontrar este dato en esta página más rápido a través de la búsqueda binaria.

Entonces, si desea encontrar (20,2, 'e') este dato.
1) Puede encontrar la página 10 primero y luego encontrar que no se encuentra a través de la búsqueda de 2 puntos;
2) Luego buscar la siguiente página 28 a través de la lista vinculada y luego encontrar que todavía no se encuentra a través de la búsqueda binaria;
3 ) Luego busque la siguiente página 9 a través de la lista enlazada, luego a través de la búsqueda binaria, se puede encontrar en este momento, y esto es para devolver el registro de datos.

1.4 Búsqueda de página basada en registros de entrada de directorio

En 1.3, se puede ver que hay un problema obvio con la búsqueda de varias páginas, es decir, después de que aumenta la cantidad de datos, la velocidad de búsqueda secuencial uno por uno es demasiado lenta.

Por lo tanto, se puede crear un elemento de directorio para cada página, y cada elemento de directorio incluye las dos partes siguientes:

  1. El valor de clave principal mínimo de la página, representado por clave
  2. Número de página, representado por page_no

Por lo tanto, las múltiples páginas en 1.3 pueden representarse por la siguiente figura en este momento.
En este momento, todavía buscamos (20,2,'e') estos datos.
1) En esta página de artículos del catálogo, busque el artículo 3 del catálogo mediante una búsqueda de 2 puntos. Debido a que la clave principal 20 es mayor que la clave principal mínima 12 del elemento 3 del directorio, la clave principal mínima 209 del elemento 4 del directorio Xiaoyu.
3) Vaya a la página 9 en el elemento 3 del directorio y busque este registro a través de la búsqueda de 2 puntos.

En este punto, puede ver que en 1.3, la búsqueda se realiza página por página, y cada vez se debe cargar una página de datos del disco, lo que lleva mucho tiempo. Después de agregar el directorio, solo necesita cargar las páginas del disco dos veces para encontrar los datos.

Cabe señalar que el tiempo que lleva cargar páginas de disco es mucho mayor que el tiempo que consume en memoria, y la magnitud de los dos es al menos 10 o más . Por lo tanto, en este momento, no hay necesidad de preocuparse por si la complejidad temporal de un algoritmo en el programa es 0(n) u O(n2). Porque si el disco carga páginas muchas veces, el tiempo que consume es mucho mayor que el tiempo para ejecutar el programa en la memoria.
inserte la descripción de la imagen aquí

En este momento, la estructura de datos de la página basada en el registro de entrada del directorio es como se muestra en la figura a continuación.
inserte la descripción de la imagen aquí
Se puede ver que la primera capa es el registro de entrada del directorio y la segunda capa es el registro de datos.
La entrada del directorio registra solo el valor mínimo de la clave principal y la dirección física de la página correspondiente. El registro de datos contiene realmente los datos de este registro. Su distinción se basa en el atributo record_type presentado anteriormente:

  • 0: registro de usuario común
  • 1: registro de entrada de directorio
  • 2: registro mínimo
  • 3: registro máximo

Cabe señalar que dado que los registros de datos contienen datos, la cantidad de registros de directorio almacenados en una página (16 KB) suele ser mayor que la cantidad de registros de datos existentes.

Por ejemplo, el tamaño de un registro de datos es 160B, entonces una página de disco puede almacenar 100 registros de datos.
Dado que un registro de directorio solo tiene el valor de clave principal mínimo de la página y la dirección física de la página, solo hay 2 valores, suponiendo que el tamaño de un registro de directorio es 16B, entonces una página de disco puede almacenar 1000 registros.
Por lo tanto, la cantidad de registros de datos que se pueden almacenar en la estructura de directorio de 2 niveles en este momento es: 1000 * 100 = 100 000, es decir, 100 000 registros.

Por lo tanto, para 100.000 registros, podemos ubicar rápidamente la dirección física de la página a través de una búsqueda de 2 puntos en la primera capa, y luego encontrar rápidamente este dato a través de una búsqueda binaria en esta página. Por lo tanto, se pueden encontrar 100.000 piezas de datos cargando la página del disco unas 2 veces.

1.5 Página de catálogo basada en la página de registro de artículos del catálogo

De acuerdo con el ejemplo anterior, ¿qué sucede si hay más de 100 000 datos? Ese único registro de entrada de directorio definitivamente no es suficiente. Por ejemplo, si hay 100 millones de datos, de acuerdo con el ejemplo anterior, se requieren 1000 páginas de registro de elementos de directorio:
inserte la descripción de la imagen aquí

En este momento, si desea buscar un determinado dato, debe buscar uno por uno en la página de registro de entrada del directorio de primer nivel, y la página del disco debe cargarse cada vez, por lo que la velocidad es muy lenta.

Por lo tanto, puede consultar el método anterior y agregar otra capa: la página de catálogo de la página de registro de entrada de catálogo. Como se muestra abajo:
inserte la descripción de la imagen aquí

El método de búsqueda es similar al anterior, y ahora hay una capa adicional.De acuerdo con el ejemplo anterior, la cantidad de datos que se pueden almacenar en este momento es: 1000 (
la página del elemento del directorio de primer nivel) × 1000 ( la página de elementos del directorio de segundo nivel) * 100 = 1,0000,0000 piezas de datos, es decir, 100 millones de piezas de datos.

Por supuesto, si la cantidad de datos es mayor, puede continuar aumentando la cantidad de capas. Si se agrega una capa más, se pueden almacenar 100 mil millones de datos, lo que ya es mucho para el negocio general, por lo que la cantidad de capas del índice general no excederá las 4 capas .

1.6 B+ árbol

Lo anterior ha analizado cómo crear una estructura de datos para encontrar rápidamente registros de datos en la base de datos.Esta estructura de datos es más o menos como se muestra en la siguiente figura: El
inserte la descripción de la imagen aquí
nombre de esta estructura de datos es árbol B+.

Ya sea una página de datos que almacene registros de usuarios o una página de datos que almacene registros de elementos de directorio, los almacenamos en la estructura de datos del árbol B+, por lo que también llamamos a estas páginas de datos nodos. En la figura se puede ver que los registros de usuario reales se almacenan en los nodos inferiores del árbol B+. Estos nodos también se denominan nodos hoja, y el resto de los nodos utilizados para almacenar elementos del directorio se denominan nodos no hoja o nodos internos El nodo en la parte superior del árbol B+ también se denomina nodo raíz.

¡En circunstancias normales, el árbol B+ que usamos no excederá las 4 capas!
Aunque se ha dado el ejemplo anterior, aquí hay un resumen.
Suponiendo que el tamaño de un registro de datos es de 160B, entonces una página de disco (16K) puede almacenar hasta 100 piezas de datos. Dado que la página del directorio solo necesita almacenar el valor mínimo de la clave primaria del registro de datos y la dirección de la página del registro de datos, los datos de entrada del directorio almacenados en una página de disco deben ser más que el número de elementos de datos, suponiendo que se pueden almacenar 1000 entradas. ser almacenados.

  1. Si el árbol B+ tiene solo 1 capa: una página de disco (16K) puede almacenar hasta 100 piezas de datos.
  2. Si el árbol B+ tiene 2 capas: puede almacenar hasta 1000 × 100 = 100 000 (100 000 datos)
  3. Si el árbol B+ tiene 3 capas: puede almacenar hasta 1000 × 1000 × 100 = 1,0000,0000 (100 millones de datos)
  4. Si el árbol B+ tiene 4 capas: puede almacenar hasta 1000 × 1000 × 1000 × 100 = 1000,0000,0000 (100 mil millones de datos)

Por lo tanto, para 100 mil millones de datos, solo necesita cargar hasta 4 páginas de disco (3 páginas de elementos de directorio, 1 página de registro de datos de usuario) para encontrar los datos a través del valor de clave principal, y también hay un Directorio de páginas (página directorio) en cada directorio de páginas), es decir, se puede ubicar rápidamente a través del método de dicotomía, sin tener que consultar uno por uno a través de la lista enlazada.

2. Resumen del índice

A través de la primera sección, se ha analizado todo el proceso de recuperación del árbol B+ de registros de datos en mysql.En este momento, puede ser mejor comprender el concepto y las ventajas y desventajas de los índices. De lo contrario, cuando aparezca y mire muchas descripciones de texto, puede sentirse muy confundido.

Por lo tanto, debe explicarse, ¿por qué debemos construir un índice?
De lo anterior, podemos saber que el propósito de la indexación es reducir el número de E/S de disco y acelerar la eficiencia de las consultas.

2.1 Resumen del índice

Un índice es una estructura de datos que ayuda a los colegios y universidades de mysql a obtener datos, por lo que un índice es una estructura de datos .

Los índices se implementan en motores de almacenamiento, por lo que los índices de cada motor de almacenamiento no son necesariamente idénticos y cada motor de almacenamiento no admite necesariamente todos los tipos de índice.

Al mismo tiempo, el motor de almacenamiento puede definir el número máximo de índices y la longitud máxima del índice para cada tabla. Todos los motores de almacenamiento admiten al menos 16 índices por tabla, con una longitud de índice total de al menos 256 bytes. Algunos motores de almacenamiento admiten más índices y longitudes de índice más grandes.

2.2 Ventajas de los índices

  1. Similar al índice bibliográfico creado por una biblioteca universitaria, la razón principal para crear un índice es mejorar la eficiencia de la recuperación de datos y reducir el costo de IO de la base de datos.
  2. Al crear un índice único, se puede garantizar la unicidad de cada fila de datos en la tabla de la base de datos.
  3. En términos de lograr la integridad referencial de los datos, puede acelerar las uniones entre tablas. En otras palabras, la velocidad de consulta se puede mejorar cuando la tabla secundaria dependiente y la tabla principal se consultan conjuntamente.
  4. Cuando se utilizan cláusulas de agrupación y clasificación para la consulta de datos, el tiempo de agrupación y clasificación en la consulta se puede reducir significativamente y el consumo de CPU se puede reducir

2.3 Desventajas de los índices

  1. La creación y el mantenimiento de índices llevan tiempo y, a medida que aumenta la cantidad de datos, aumenta el tiempo consumido.
  2. Los índices necesitan ocupar espacio en disco Además del espacio de datos ocupado por la tabla de datos, cada índice también ocupa una cierta cantidad de espacio físico y se almacena en el disco. Si hay una gran cantidad de índices, los archivos de índice pueden alcanzar su tamaño de archivo máximo antes que los archivos de datos.
  3. Aunque el índice mejora considerablemente la velocidad de consulta, ralentizará la velocidad de actualización de la tabla. Al agregar, eliminar y modificar los datos de la tabla, el índice también debe mantenerse de forma dinámica, lo que reduce la velocidad del mantenimiento de datos.

3. Conceptos comunes de indexación

Según la implementación física del índice, se puede dividir en dos tipos: índice agrupado e índice no agrupado. Los índices no agrupados también se denominan índices secundarios o índices auxiliares.

3.1 Índice agrupado

El índice agrupado no es un tipo de índice separado, sino un método de almacenamiento de datos (todos los registros de usuario se almacenan en nodos hoja), es decir, el llamado índice son datos y los datos son índices .

Este tipo de índice agrupado no requiere que usemos explícitamente la declaración INDEX para crearlo en mysql. El motor de almacenamiento InnoDB creará automáticamente un índice agrupado para nosotros .

ventajas :

  • El acceso a los datos es más rápido . Debido a que un índice agrupado almacena el índice y los datos en el mismo árbol B+, obtener datos de un índice agrupado es más rápido que un índice no agrupado.
  • Los índices agrupados son muy rápidos para búsquedas de tipo de clave principal y búsquedas de rango .
  • De acuerdo con el orden del índice agrupado, cuando la consulta muestra un cierto rango de datos, dado que los datos están estrechamente conectados, la base de datos no necesita extraer datos de múltiples bloques de datos y el índice ahorra muchas operaciones io .

Desventajas :

  • La velocidad de inserción depende en gran medida del orden de inserción . Insertar en el orden de la clave principal es la forma más rápida, de lo contrario se producirán divisiones de página, lo que afectará gravemente al rendimiento. Por lo tanto, para las tablas de InnoDB, una columna de ID de incremento automático generalmente se define como la clave principal .
  • Actualizar una clave principal es costoso porque la fila que se actualiza se moverá. Por lo tanto, para las tablas de innoDB, generalmente definimos la clave principal como no actualizable .
  • El acceso al índice secundario requiere 2 búsquedas en el índice . El valor de la clave principal se encuentra por primera vez y los datos de la fila se encuentran por segunda vez en función del valor de la clave principal.

Restricciones :

  • Para la base de datos mysql, solo el motor de datos innodb actualmente admite índices agrupados, mientras que myisam no admite índices agrupados.
  • Dado que solo puede haber un método de almacenamiento físico para los datos, cada tabla mysql solo puede tener un índice agrupado . Por lo general, es la clave principal de la tabla.
  • Si no se define una clave principal, InnoDB elegirá un índice único no vacío en su lugar. Si no existe dicho índice, InnoDB definirá implícitamente una clave principal como un índice agrupado .
  • Para hacer un uso completo de las características de agrupamiento del índice agrupado, la columna de clave principal de la tabla innodb debe usar una identificación de secuencia ordenada tanto como sea posible, y no se recomienda usar una identificación desordenada, como UUID, MD5 , HASH y una columna de cadena como clave principal no pueden garantizar el orden de crecimiento de los datos.

3.1 Índice no agrupado (índice secundario, índice auxiliar)

El índice agrupado presentado anteriormente solo puede funcionar cuando la condición de búsqueda es la clave principal, porque los datos en el árbol B+ se ordenan de acuerdo con la clave principal. Entonces, ¿qué pasa si queremos usar otras columnas como criterios de búsqueda?

Puede construir varios árboles B+ más .
Los datos en diferentes árboles B+ adoptan diferentes reglas de clasificación.Por ejemplo, el tamaño de la columna c2 en el ejemplo anterior se puede usar como página de datos para construir otro árbol B+.
inserte la descripción de la imagen aquí
El concepto de volver a la tabla :
según el árbol B+ ordenado por el tamaño de la columna c2, solo podemos determinar el valor de la clave principal del registro que queremos encontrar, por lo que si queremos encontrar el registro de usuario completo, debemos Todavía es necesario verificarlo nuevamente en el índice agrupado.Este proceso se llama back table.

Debido a que este tipo de árbol B+ construido de acuerdo con la columna de clave no principal necesita una operación de retorno de tabla para ubicar el registro de usuario completo, este tipo de árbol B+ también se denomina índice secundario (índice secundario) o índice auxiliar.

La presencia de un índice no agrupado no afecta la organización del índice subagrupado de datos, por lo que una tabla puede tener varios índices no agrupados.

resumen:

  1. Los nodos de hoja del índice agrupado almacenan nuestros registros de datos de usuario , y los nodos de hoja del índice no agrupado almacenan la ubicación de los datos . Los índices no agrupados no afectan el orden de almacenamiento físico de las tablas de datos.
  2. Una tabla solo puede tener un índice agrupado , porque solo puede haber una forma de ordenar y almacenar, pero puede haber múltiples índices no agrupados , es decir, varios directorios de índices brindan recuperación de datos.
  3. Cuando se utiliza un índice agrupado, la eficiencia de la consulta de datos es alta , pero si los datos se insertan, eliminan, actualizan, etc., la eficiencia será menor que la del índice no agrupado.

3.3 Índice conjunto

Un índice conjunto puede entenderse como un tipo de índice no agrupado, excepto que indexa varias columnas al mismo tiempo.

Por ejemplo, use las columnas c2 y c3 presentadas anteriormente para crear un índice:
inserte la descripción de la imagen aquí

4. Precauciones para el índice de árbol B+ de InnoDB

4.1 La ubicación de la página raíz permanece sin cambios durante diez mil años

El nodo raíz de un índice de árbol B+ no se moverá desde su nacimiento. Es decir, cada vez que se crea un índice de árbol B+ para una tabla, se creará una página de nodo raíz , que almacena los registros del usuario al principio , y cuando la página está llena, se produce la división de la página, de modo que los datos del usuario llegan a la Capa 2, luego la página del nodo raíz se convierte en la página de registro de entrada del directorio .

Una explicación más popular es que el árbol B+ presentado anteriormente se crea lentamente de arriba a abajo.

4.2 Unicidad de registros de entrada de directorio en nodos internos

Si los nodos que no son hoja, es decir, los registros de entrada del directorio de nodos internos son completamente consistentes, como se muestra en la figura a continuación.
Luego hay un nuevo dato: 0,1,'c', no sé en qué página insertarlo.
inserte la descripción de la imagen aquí

En este momento, es necesario asegurarse de que el registro de entrada de directorio del nodo en la misma capa del árbol B+ sea único excepto por el campo del número de página, luego se puede agregar el valor de la clave principal en este momento, para que el El registro de entrada de directorio del nodo interno debe ser único. :

  • el valor de la columna indexada
  • valor de la clave principal
  • número de página

inserte la descripción de la imagen aquí

4.3 Una página almacena al menos 2 registros

Una página de datos de InnoDB almacena al menos 2 registros; de lo contrario, el esquema de estructura de árbol B+ presentado anteriormente no tendría sentido.

5. Esquema de índice en MyISAM

5.1 El principio del índice MyISAM

El motor MyISAM utiliza un árbol B+ como estructura de índice, pero el campo de datos de sus nodos hoja almacena las direcciones de los registros de datos .

El índice en InnoDB es data (.idb) , es decir, el nodo hoja del árbol B+ del índice agrupado contiene registros de datos de usuario completos.
Aunque MyISAM también utiliza una estructura de árbol , almacena índices y datos por separado .

  1. MyISAM almacena los registros de la tabla en un archivo separado en el orden de inserción, que se denomina archivo de datos (.MYD) . Dado que los datos no se clasifican deliberadamente según el tamaño de la clave principal al insertar datos, no es posible utilizar el método de dicotomía para buscar estos datos.
  2. MyISAM almacena información de índice en un archivo llamado archivo de índice (.MYI) . MyISAM creará un índice por separado para la clave principal de la tabla, pero lo que se almacena en el nodo hoja del índice no es el registro de usuario completo, sino el valor de la clave principal + la dirección del registro de datos del usuario .

La siguiente figura muestra el formato de almacenamiento de un archivo de índice con col1 como clave principal.
inserte la descripción de la imagen aquí
La siguiente figura es un índice secundario construido con col2.
inserte la descripción de la imagen aquí

5.2 Comparación entre MyISAM e InnoDB

Todos los métodos de indexación de MyISAM no están agrupados. InnoDB, además de no agrupado , también contiene un índice agrupado.

  1. Los archivos de datos de InnoDB son en sí mismos archivos de índice (.idb) . El archivo de índice (.MYI) y el archivo de datos (.MYD) de MyISAM están separados , y el archivo de índice solo guarda la dirección del registro de datos .
  2. Si InnoDB busca el índice agrupado en función del valor de la clave principal, solo necesita encontrar el registro de datos del usuario una vez. Sin embargo, dado que el archivo de índice MyISAM almacena la dirección del registro de datos del usuario, debe haber una operación de retorno de tabla .
  3. El índice no agrupado de InnoDB almacena el valor de la clave principal del registro de datos y luego necesita volver a la tabla para encontrar el registro de datos a través del valor de la clave principal. El índice MyISAM registra la dirección del registro de usuario, por lo que la operación de la tabla de retorno de MyISAM es definitivamente más rápida que la de InnoDB .
  4. InnoDB requiere que la tabla tenga una clave principal. Si no se especifica explícitamente, automáticamente seleccionará una columna que puede ser no nula e identificará de manera única el registro de datos como la clave principal. Si no se encuentra, automáticamente generar un campo implícito como clave principal. La longitud de este campo es de 6 bytes, el tipo es un entero largo. Y MyISAM no puede.

Resumen:
Comprender los métodos de implementación de índices de diferentes motores de almacenamiento es muy útil para el uso correcto y la optimización de los índices.
Ejemplo 1: Después de conocer la implementación del índice de InnoDB, es fácil entender por qué no se recomienda utilizar campos demasiado largos como claves principales . Dado que todos los índices secundarios hacen referencia al índice de clave principal, una clave principal larga puede hacer que el índice secundario sea demasiado grande.
Ejemplo 2: en InnoDB, no es una buena idea usar campos no monótonos como claves principales. La clave principal no monótona hará que el archivo de datos se divida y ajuste con frecuencia para mantener las características del árbol B+ al insertar un nuevo registro, lo cual es muy ineficiente. Usar un campo de incremento automático como clave principal es una buena opción . .

Supongo que te gusta

Origin blog.csdn.net/xueping_wu/article/details/125351669
Recomendado
Clasificación