[Notas de estudio de MySQL (6)] Explicación detallada del esquema de índice en InnoDB y MyISAM

¡Este artículo es publicado por la cuenta oficial [Developing Pigeon]! ¡Bienvenido a seguir! ! !


Old Rules-Sister Town House:

Uno. índice

(I. Resumen

       Si no hay un índice, recorremos directamente todas las páginas cuando buscamos registros y luego recorremos todos los registros para llegar al registro final, que es muy ineficiente. Por lo tanto, necesitamos utilizar el índice para mejorar la eficiencia de la búsqueda.


(Dos) esquema de índice en InnoDB

1. Reglas del índice

       Dado que el almacenamiento de registros en cada página es irregular, no hay ninguna pista al buscar y no sé por dónde empezar. Si queremos encontrar un registro, primero debemos encontrar en qué página se encuentra el registro y qué condiciones debemos usar para ubicar el registro. La clave principal es una buena opción, imitando la práctica del directorio de la página en la página, el valor de la clave principal del registro del usuario en la siguiente página de índice debe ser mayor que el valor de la clave principal del registro del usuario en la página anterior, por lo que que la clave principal se puede utilizar para determinar cada rango de páginas. Para mantener este estado, es necesario mantener el orden de las diferentes páginas a través de algunas operaciones de movimiento de registros durante el proceso de agregar, eliminar y modificar registros en la página. Luego, cree un directorio para todas las páginas, cada página corresponde a una entrada de directorio, cada entrada de directorio incluye dos partes: la clave de valor de clave primaria más pequeña en el registro de usuario de la página y el número de página page_no.

       Luego, cuando buscamos el registro, determinamos directamente la página donde se encuentra el registro a través del valor de la clave principal del registro, y luego ingresamos a la página para encontrar la ranura donde se encuentra el registro a través del directorio de la página, y luego recorremos los registros en la ranura. De esta forma, la eficiencia de búsqueda será mucho mayor.

2. Esquema de índices en InnoDB

       InnoDB utiliza las páginas como unidad básica de gestión del espacio de almacenamiento, pero garantiza un máximo de 16 KB de espacio de almacenamiento continuo. Si el número de páginas de la tabla es particularmente grande, siempre habrá un día en el que el número de páginas supere los 16 KB. Y si se elimina una página, el elemento correspondiente a la página en el elemento del directorio debe eliminarse o almacenarse en el elemento del directorio como redundancia, lo que desperdicia espacio de almacenamiento. Estos problemas deben resolverse.

       InnoDB almacena las entradas del directorio reutilizando la página de índice que almacena los registros del usuario. Para distinguir, estos registros utilizados para representar las entradas del directorio se denominan registros de entrada del directorio. El atributo record_type en la información del encabezado del registro es 1, y el registro de usuario normal es 0 . Y el registro de entrada del directorio tiene solo dos columnas: el valor de la clave principal y el número de página.

       Entonces, la pregunta es nuevamente, ¿cómo ubicamos estas páginas que almacenan entradas de directorio?

       Es posible que estas páginas no estén una al lado de la otra en el espacio de almacenamiento, y puede haber muchas páginas que almacenan registros de entrada de directorio ¿Cómo ubicar rápidamente una página que almacena registros de entrada de directorio según el valor de la clave principal? La respuesta es generar un directorio de nivel superior para las páginas que almacenan los registros de las entradas del directorio, como un directorio de varios niveles. Esta estructura es como un árbol, llamado árbol B +, los registros de usuario se almacenan en nodos hoja y los nodos no hoja son registros de elementos de directorio. El nivel 0 es el nivel donde se ubican los nodos de hojas. Generalmente, el árbol B + no excederá los 4 niveles.


3. Índice agrupado

       Un índice agrupado es un árbol B + que cumple las siguientes condiciones:

       (1) Los registros de la página están organizados en una lista enlazada individualmente en el orden del tamaño de la clave principal. Los registros se dividen en varios grupos. El desplazamiento del registro con el valor de clave principal más grande en cada grupo será almacenado como una ranura en la página. Directorio de páginas.

       (2) Las páginas que almacenan el directorio de usuarios están organizadas en una lista doblemente enlazada según el tamaño de la clave primaria.

       (3) Las páginas que almacenan los registros de entrada del directorio se dividen en diferentes niveles. Las páginas del mismo nivel también están organizadas en una lista doblemente enlazada según el tamaño de la clave primaria de los registros de entrada del directorio en la página.

       (4) Los nodos hoja del árbol B + almacenan registros de usuario completos, incluidas las columnas ocultas.

       El índice agrupado no requiere que usemos explícitamente la declaración INDEX en la declaración MySQL para crear, InnoDB, este es el método de almacenamiento.


4. Índice secundario

       El índice agrupado solo puede funcionar cuando la condición de búsqueda es la clave principal. ¿Qué pasa con otras columnas?

       Podemos construir algunos árboles B + más, y los datos en diferentes B + usan diferentes reglas de clasificación. ¿Cuál es la diferencia entre este árbol B + y el índice agrupado?

       (1) Lo que almacena el nodo hoja no es un registro de usuario completo, sino una columna de índice + clave principal. Cuando encontramos el registro de índice correspondiente, usamos la clave principal para encontrar el registro de usuario completo en el índice agrupado. Esta operación es llamó volviendo a la mesa. Luego regrese al nodo hoja de este árbol B + y continúe buscando a lo largo de la lista enlazada individualmente. La ventaja de este esquema es el ahorro de espacio, razón por la cual también se denomina índice secundario, y se debe realizar la operación secundaria de volver a la tabla.

       (2) El registro de entrada de directorio es la columna de índice + clave principal + número de página. Si no se agrega la clave principal, hay varios valores idénticos en la columna de índice y las columnas de índice de diferentes páginas en la entrada de directorio son Cuando la página se divide, es imposible determinar en qué página se debe colocar el primer registro insertado, por lo que es necesario agregar una clave primaria para garantizar la unicidad de la búsqueda.

       Cuando declaramos ÚNICO para una determinada columna o combinación de columnas, se creará un índice secundario para esta columna o combinación de columnas. Pero incluso con la bendición del atributo ÚNICO, puede haber varios registros con el mismo valor de clave, como todos los valores NULL o servicios MVCC.

5. Índice conjunto

       El tamaño de varias columnas se puede utilizar como regla de clasificación al mismo tiempo y se pueden indexar varias columnas al mismo tiempo. Por ejemplo, si el árbol B + se ordena según el tamaño de las columnas c2 y c3, significa :

       (1) Primero ordene los registros y las páginas de acuerdo con la columna c2
       (2) Cuando la columna c2 del registro sea la misma, utilice la columna c3 para ordenar

       Cada entrada de directorio se compone de tres partes: columna c2, columna c3 y número de página. Los registros de usuario se componen de columna c2, columna c3 y clave primaria.


(3) Asuntos que necesitan atención

1. La página raíz no se moverá

       La creación de un índice de árbol B + para una tabla creará una página de nodo raíz para este índice. Cuando no hay datos en la tabla inicialmente, no hay registro de usuario ni registro de entrada de directorio en la página raíz correspondiente. Luego inserte los registros de usuario. Cuando se agote el espacio disponible en el nodo raíz, todos los registros en el nodo raíz se copiarán a una página recién asignada, y esta nueva página se dividirá para obtener otra nueva página, la raíz El nodo es ahora actualizado a la página que almacena el registro de entrada de directorio, y el registro de entrada de directorio del registro de usuario debe insertarse en el nodo raíz.

       El nodo raíz del índice del árbol B + nunca se moverá, es decir, el número de página no cambiará y se registrará en algún lugar. InnoDB necesita usar este índice para encontrar el número de página del nodo raíz desde un lugar fijo y acceder a este índice.


2. Al menos dos registros en una página

       Si un directorio grande contiene solo un subdirectorio, entonces la jerarquía de directorios será muy grande, por lo que InnoDB estipula que una página tiene al menos dos registros.


(4) Esquema de indexación en MyISAM

       MyISAM almacena índices y datos por separado. Los registros de la tabla se almacenan en un archivo de acuerdo con el orden de inserción de los registros (clasificación de clave no primaria, por lo que no se pueden dividir en dos). Se denominan archivos de datos. Las páginas de datos no se dividen y los registros se buscan directamente por número de fila.

       La información del índice se almacena por separado en el archivo de índice y se crea un índice por separado para la clave principal de la tabla. Lo que se almacena en el nodo hoja del índice no es el registro de usuario completo, sino la clave principal + el número de fila, es decir, el número de fila correspondiente se encuentra a través del índice, luego busque el registro de usuario por número de línea. Por lo tanto, los índices en MyISAM son todos índices secundarios.

       Para el formato de fila de los registros MyISAM, hay un formato de registro de longitud fija, un formato de registro de longitud variable y un formato de registro comprimido. El formato de registro de longitud fija puede calcular el desplazamiento de dirección de un registro en el archivo de datos a través del número de línea, pero el formato de registro de longitud variable no funciona, por lo que es necesario almacenar el desplazamiento de dirección del registro en el archivo de datos. en el nodo hoja índice la cantidad. En este sentido, MyISAM es más eficiente porque obtiene directamente el desplazamiento de la dirección para buscar registros en el archivo, mientras que InnoDB usa la clave principal para encontrar registros en el índice agrupado.


(5) Cree y elimine índices en MySQL

       InnoDB y MyISAM indexarán automáticamente la clave principal o la columna ÚNICA, y se deben mostrar y especificar otras columnas.

1. Crea un índice

CREATE TABLE 表名(
	(KEY | INDEX) 索引名 单个列或多个列
);
ALTER TABLE 表名 ADD (KEY | INDEX) 索引名 单个列或多个列;

2. Eliminar el índice

ALTER TABLE 表名 DROP (KEY | INDEX) 索引名;

3. Índice conjunto

CREATE TABLE 表名(
	(KEY | INDEX) 索引名 (多个列)
);

       El nombre de índice del índice conjunto debe tener el prefijo idx_ tanto como sea posible, seguido de los nombres de varias columnas.

Supongo que te gusta

Origin blog.csdn.net/Mrwxxxx/article/details/113804497
Recomendado
Clasificación