[MySQL] (13) Hablando sobre el análisis de optimización del índice MySQL

Escrito al frente : Soy "Yun Qi", un desarrollador de big data que ama la tecnología y puede escribir poesía. El apodo proviene de una línea del poema de Wang Anshi [ 云之祁祁,或雨于渊 ], que me gusta mucho.


Por un lado, bloguear es resumir y registrar un poco de lo que has aprendido, y por otro lado, es ayudar a más amigos interesados ​​en big data. Si también está 数据中台、数据建模、数据分析以及Flink/Spark/Hadoop/数仓开发interesado, puede concentrarse en mi https://blog.csdn.net/BeiisBei dinámico , permítanos aprovechar el valor de los datos:


每天都要进步一点点,生命不是要超越别人,而是要超越自己! (ง •_•)ง

Uno, el concepto de índice

1.1 Qué es

La definición oficial de índice de MySQL es: El índice es una estructura de datos que ayuda a MySQL a obtener datos de manera eficiente. Puede obtener la esencia del índice: el índice es una estructura de datos. Se puede entender simplemente como la fila encuentra rápidamente el orden correcto de la estructura de datos .

Además de los datos, el sistema de base de datos también mantiene estructuras de datos que cumplen con algoritmos de búsqueda específicos, que hacen referencia (señalan) a los datos de una manera determinada, de modo que se pueden implementar algoritmos de búsqueda avanzados en estas estructuras de datos. Esta estructura de datos es el índice. La siguiente figura es un ejemplo de un posible método de indexación:

Inserte la descripción de la imagen aquí
A la izquierda está la tabla de datos, hay dos columnas de siete registros y el extremo izquierdo es la dirección física del registro de datos. Para acelerar la búsqueda de Col2, se puede mantener un árbol de búsqueda binaria como se muestra a la derecha. Cada nodo contiene un valor de clave de índice y un puntero a la dirección física del registro de datos correspondiente, de modo que la búsqueda binaria se puede usar dentro de una cierta complejidad Obtener los datos correspondientes, para recuperar rápidamente los registros que cumplen las condiciones.

En términos generales, el índice en sí también es muy grande y es imposible almacenarlo todo en la memoria, por lo tanto, el índice a menudo se almacena en un disco en forma de archivo de índice.

1.2 Ventajas y desventajas

Ventaja:

  • Mejore la eficiencia de la recuperación de datos y reduzca el costo de IO de la base de datos.
  • La clasificación de datos por columna de índice reduce el costo de clasificación de datos y reduce el consumo de CPU.

Desventajas:

  • Aunque el índice mejora enormemente la velocidad de la consulta, reducirá la velocidad de actualización de la tabla, como INSERT, UPDATE y DELETE en la tabla. Porque al actualizar una tabla, MySQL no solo guarda los datos, sino que también guarda el archivo de índice cada vez que se actualiza el archivo de índice para agregar el campo de la columna de índice, ajustará la información del índice después de los cambios de valor clave provocados por la actualización.
  • De hecho, el índice también es una tabla, que almacena la clave principal y los campos de índice, y apunta a los registros de la tabla de entidad, por lo que la columna de índice también ocupa espacio.

Dos, índice MySQL

2.1 índice Btree

MySQL usa índices Btree.

Inserte la descripción de la imagen aquí

[Introducción a la inicialización]

Para un árbol B, el bloque azul claro se llama bloque de disco. Puede ver que cada bloque de disco contiene varios elementos de datos (mostrados en azul oscuro) y punteros (mostrados en amarillo).

Por ejemplo, el bloque de disco 1 contiene los elementos de datos 17 y 35, y contiene los punteros P1, P2, P3,

P1 significa bloques de disco menores de 17, P2 significa bloques de disco entre 17 y 35, y P3 significa bloques de disco mayores de 35.

Los datos reales existen en los nodos hoja, a saber, 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90, 99.

Los nodos que no son hojas solo almacenan datos reales, solo elementos de datos que guían la dirección de búsqueda. Por ejemplo, 17 y 35 no existen realmente en la tabla de datos.

[Proceso de búsqueda]

Si desea encontrar el elemento de datos 29, primero cargue el bloque de disco 1 desde el disco a la memoria. En este momento, se produce una E / S. Utilice una búsqueda binaria para determinar que 29 está entre 17 y 35 en la memoria. Bloquee el puntero P2 del bloque de disco 1. El tiempo es muy corto (en comparación con la E / S del disco) y se puede ignorar. El bloque de disco 3 se carga desde el disco a la memoria a través de la dirección de disco del puntero P2 del bloque de disco 1, y se produce la segunda E / S. 29 está entre 26 y 30, bloqueado El puntero P2 del bloque de disco 3 carga el bloque de disco 8 en la memoria a través del puntero y se produce el tercer IO. Al mismo tiempo, se realiza una búsqueda binaria en la memoria para encontrar 29, y la consulta finaliza, y un total de tres IO.

La situación real es que un árbol B + de 3 niveles puede representar millones de datos. Si millones de búsquedas de datos solo requieren tres IO, la mejora del rendimiento será enorme. Si no hay índice, cada elemento de datos tendrá un IO Entonces se requieren un total de millones de IO, lo que obviamente es muy caro.

2.2 Índice de árbol B +

Inserte la descripción de la imagen aquí

La diferencia entre B + Tree y B-Tree

1) Las palabras clave y los registros del árbol B se juntan. Los nodos hoja se pueden considerar como nodos externos y no contienen ninguna información; los nodos no hoja del árbol B + solo tienen las palabras clave y el índice del siguiente nodo, y los registros solo se colocan En el nodo hoja.

2) En el árbol B, cuanto más cerca esté el registro del nodo raíz, más rápido será el tiempo de búsqueda, siempre que se encuentre la palabra clave, se puede determinar la existencia del registro; mientras que el tiempo de búsqueda para cada registro en el árbol B + es básicamente el mismo, y debe comenzar desde el nodo raíz Vaya al nodo hoja y compare las palabras clave en el nodo hoja.

Desde este punto de vista, el rendimiento del árbol B parece ser mejor que el del árbol B +, pero en las aplicaciones reales el rendimiento del árbol B + es mejor. Debido a que los nodos que no son hojas del árbol B + no almacenan datos reales, la cantidad de elementos que puede contener cada nodo es mayor que la del árbol B, y la altura del árbol es menor que la del árbol B. Esto tiene la ventaja de reducir el número de accesos al disco.

Aunque el árbol B + requiere más comparaciones para encontrar un registro que el árbol B, el tiempo de acceso a un disco es equivalente al tiempo de cientos o miles de comparaciones de memoria. Por lo tanto, el rendimiento del árbol B + en la práctica puede ser mejor, y B + Los nodos hoja del árbol se conectan entre sí mediante punteros para facilitar el recorrido secuencial (por ejemplo, ver todos los archivos en un directorio, todos los registros en una tabla, etc.) Por eso, muchas bases de datos y sistemas de archivos usan árboles B +.

Pensando: ¿Por qué el árbol B + es más adecuado para el índice de archivos y el índice de base de datos del sistema operativo en una aplicación práctica que el árbol B?

1) El costo de lectura y escritura en disco del árbol B + es menor

El nodo interno del árbol B + no tiene un puntero a la información específica de la palabra clave. Por lo tanto, sus nodos internos son más pequeños que el árbol B. Si todas las palabras clave del mismo nodo interno se almacenan en el mismo bloque de disco, más palabras clave puede contener el bloque de disco. Las más palabras clave que deben buscarse se leen en la memoria a la vez. En términos relativos, se reduce el número de lecturas y escrituras de E / S.

2) La eficiencia de consulta del árbol B + es más estable

Porque el punto no terminal no es el nodo que finalmente apunta al contenido del archivo, sino solo el índice de la palabra clave en el nodo hoja. Por lo tanto, cualquier búsqueda de palabras clave debe tomar una ruta desde el nodo raíz hasta el nodo hoja. La longitud de la ruta de todas las consultas de palabras clave es la misma, lo que resulta en la misma eficiencia de consulta para cada dato.

2.3 Índice agrupado e índice no agrupado

El índice agrupado no es un tipo de índice separado, sino un método de almacenamiento de datos. El término "agrupación" significa que las filas de datos y las agrupaciones de valores clave adyacentes se almacenan juntas. Como se muestra en la figura siguiente, el índice de la izquierda es un índice agrupado, porque la disposición de las filas de datos en el disco es coherente con el orden del índice.

Inserte la descripción de la imagen aquí

Beneficios del índice agrupado: según el orden del índice agrupado, cuando la consulta muestra un cierto rango de datos, debido a que los datos están estrechamente conectados, la base de datos no necesita extraer datos de múltiples bloques de datos, por lo que ahorra muchas operaciones de io.

Limitaciones de los índices agrupados: para la base de datos mysql, solo el motor de datos innodb admite actualmente índices agrupados, mientras que Myisam no admite índices agrupados. Dado que solo puede haber un tipo de almacenamiento de datos físicos, cada tabla Mysql solo puede tener un índice agrupado. En circunstancias normales, es la clave principal de la tabla.

Para hacer un uso completo de las características de agrupación en clúster del índice agrupado, la columna de clave principal de la tabla innodb debe usarse en la medida de lo posible para usar una identificación secuencial ordenada, y no se recomienda usar una identificación desordenada, como uuid.

2.4 Complejidad temporal (ampliada)

El mismo problema puede resolverse mediante diferentes algoritmos, y la calidad de un algoritmo afectará la eficiencia del algoritmo e incluso el programa. El propósito del análisis de algoritmos es seleccionar algoritmos adecuados y mejorarlos.
La complejidad del tiempo se refiere a la cantidad de trabajo computacional requerido para ejecutar un algoritmo, que está representado por una gran O como: O (...)
Inserte la descripción de la imagen aquí

Tres, clasificación de índice MySQL

3.1 Índice de valor único

Concepto: un índice contiene solo una columna y una tabla puede tener varios índices de una sola columna.
Sintaxis:

//所表一起创建:

CREATE TABLE customer (
	id INT(10) UNSIGNED AUTO_INCREMENT ,
	customer_no VARCHAR(200),
	customer_name VARCHAR(200), 
	PRIMARY KEY(id), 
	KEY (customer_name)  // Σ(っ °Д °;)っ
);

//单独建单值索引:
CREATE INDEX idx_customer_name ON

3.2 Índice único

Concepto: el valor de la columna de índice debe ser único, pero se permiten valores nulos

//随表一起创建: 
CREATE TABLE customer (
	id INT(10) UNSIGNED AUTO_INCREMENT ,
	customer_no VARCHAR(200),
	customer_name VARCHAR(200), 
	PRIMARY KEY(id), 
	KEY (customer_name), 
	UNIQUE (customer_no)   // Σ(っ °Д °;)っ
);

//单独建唯一索引: 
CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no);

3.3 Índice de clave primaria

Concepto: después de configurar la clave principal, la base de datos creará automáticamente un índice e innodb es un índice agrupado

//随表一起建索引
CREATE TABLE customer (
	id INT(10) UNSIGNED AUTO_INCREMENT ,
	customer_no VARCHAR(200),
	customer_name VARCHAR(200), 
	PRIMARY KEY(id)   // Σ(っ °Д °;)っ
);

//单独建主键索引:
ALTER TABLE customer add PRIMARY KEY customer(customer_no);

//删除建主键索引:
ALTER TABLE customer drop PRIMARY KEY ;

//修改建主键索引:
必须先删除掉(drop)原索引,再新建(add)索引

3.4 índice compuesto

Concepto: es decir, un índice contiene varias columnas.

随表一起建索引: 
CREATE TABLE customer (
	id INT(10) UNSIGNED AUTO_INCREMENT ,
	customer_no VARCHAR(200),
	customer_name VARCHAR(200), 
	PRIMARY KEY(id), 
	KEY (customer_name), 
	UNIQUE (customer_name), 
	KEY (customer_no,customer_name)  // Σ(っ °Д °;)っ
);

单独建索引: 
CREATE INDEX idx_no_name ON customer(customer_no,customer_name);

3.5 sintaxis básica

operando mando
crear CREAR [UNIQUE] INDEX [indexName] ON table_name (columna))
Eliminar DEJAR ÍNDICE [indexName] ON mytable;
Ver MOSTRAR ÍNDICE DESDE table_name \ G
Usar el comando Alter ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): esta declaración agrega una clave primaria, lo que significa que el valor del índice debe ser único y no puede ser NULL.
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)
ALTER TABLE tbl_name ADD INDEX index_name (column_list): Agrega un índice común, el valor del índice puede aparecer varias veces.
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list): Esta declaración especifica que el índice es FULLTEXT para la indexación de texto completo.

Cuarto, el momento de la creación del índice

4.1 Situaciones adecuadas para la creación de índices

  • La clave principal crea automáticamente un índice único
  • Los campos que se utilizan con frecuencia como condiciones de consulta deben indexarse
  • Consultar los campos asociados con otras tablas en la consulta y crear índices para relaciones de clave externa
  • Problema de selección de índice combinado / clave única, el índice compuesto es más rentable
  • El campo ordenado en la consulta, si se accede al campo ordenado a través del índice, la velocidad de clasificación mejorará enormemente
  • Estadísticas o campos de agrupación en la consulta

4.2 No apto para crear índices

  • Muy pocos registros de tabla
  • Agregar, eliminar y modificar tablas o campos con frecuencia
  • Los campos no utilizados en la condición Where no están indexados
  • Un filtrado deficiente no es adecuado para la indexación

Supongo que te gusta

Origin blog.csdn.net/BeiisBei/article/details/108524474
Recomendado
Clasificación