Antes de optimizar el rendimiento de las consultas de MySQL, primero debe dominar la teoría de índices de MySQL

La indexación de la base de datos es necesaria para el trabajo diario. Cómo crear índices y cómo usarlos puede mejorar la eficiencia de la consulta de datos. Y en el proceso de entrevista, el índice de la base de datos también es un punto de conocimiento que se debe preguntar, como por ejemplo:

Seleccione la estructura subyacente del índice, entonces ¿por qué elegir árbol B +?
¿Cuáles son las manifestaciones de los índices para diferentes motores de almacenamiento?
Tipo
de índice Método de almacenamiento de índice combinado Método de
consulta
Principio de coincidencia de prefijo más a la izquierda

¿Qué es un índice de cobertura?
Mirando estos, ¿cuánto puedes decir y entender? Por lo tanto, necesitamos explorar su principio interno.

¿Qué es el índice?
El propósito de la indexación es una especie de almacenamiento distribuido (los índices suelen ser muy grandes y pertenecen al nivel del disco duro, por lo que es almacenamiento distribuido) estructura de datos diseñada para acelerar la recuperación de datos. Su principio es intercambiar espacio por tiempo.
La esencia de la recuperación rápida es la estructura de datos. A través de la selección de diferentes estructuras de datos, se realiza una recuperación rápida de varios datos. Los índices incluyen el índice hash y el índice de árbol B +.

Seleccione la estructura subyacente del índice, entonces ¿por qué elegir árbol B +?
En el análisis final, la selección subyacente de índices de bases de datos es mejorar la eficiencia de recuperación, por lo que se deben considerar varios aspectos:

Complejidad del tiempo del algoritmo ¿
Existe algún tipo?
E / S de disco y lectura
anticipada NOTA: Teniendo en cuenta que la E / S de disco es una operación muy costosa, el sistema operativo de la computadora ha realizado algunas optimizaciones. Cuando una E / S, no solo los datos de la dirección del disco actual, sino los Los datos también se leen en el búfer de memoria, porque el principio de lectura anticipada parcial nos dice que cuando la computadora accede a los datos de una dirección, también se accederá rápidamente a los datos adyacentes. Los datos leídos por cada IO se denominan página.
Tabla hash (tabla hash, tabla hash) Una
tabla hash es una estructura de datos que accede directamente a una ubicación de almacenamiento de memoria basada en una clave (clave).

Inserte la descripción de la imagen aquí
Al calcular una función sobre el valor de la clave, los datos que se van a consultar se asignan a una ubicación en la tabla para acceder al registro, lo que acelera la búsqueda. Aunque la complejidad del tiempo de consulta es O (1), existe un problema de colisión y el peor de los casos conducirá a un aumento brusco de la complejidad del tiempo;

Y la tabla hash solo es adecuada para una recuperación precisa de claves (igual), no adecuada para la recuperación de rango. La recuperación de rango requiere que todos los datos se encuentren y carguen en la memoria a la vez, lo cual es ineficiente y, por lo tanto, no es adecuado para la estructura de datos del subyacente. índice de Mysql.

"¡2020 los últimos conceptos básicos de Java y tutoriales en vídeo detallados y rutas de aprendizaje!

Árbol de búsqueda binaria ordinaria
Para optimizar la consulta de rango eficiente, y la complejidad de tiempo es pequeña,
Inserte la descripción de la imagen aquí
la complejidad de tiempo del árbol de búsqueda binaria es O (lgn). Dado que los datos están ordenados, la consulta de rango puede ser eficiente.

Pero habrá problemas: la profundidad de los nodos secundarios izquierdo y derecho puede ser muy diferente. El caso más extremo es solo el subárbol izquierdo o el subárbol derecho. En este momento, la eficiencia de búsqueda es O (n) y la recuperación el rendimiento cae drásticamente, por lo que no es adecuado para Mysql. La estructura de datos del índice subyacente.
Inserte la descripción de la imagen aquí
Árbol binario equilibrado (árbol AVL)
Para optimizar el problema de que la profundidad de los subárboles izquierdo y derecho del árbol binario es demasiado grande, introdujimos el árbol binario equilibrado, es decir, la diferencia de profundidad entre los nodos secundarios izquierdo y derecho. no excede 1. El
árbol binario balanceado parece adecuado y se puede lograr:

Se pueden realizar búsquedas de rango y clasificación de datos.
Buen rendimiento de consulta O (registro)
Inserte la descripción de la imagen aquí
NOTA: Un bloque de disco en la figura anterior representa una ubicación de almacenamiento en el disco duro,
pero aún tenemos uno de los factores más importantes a considerar, la E / S del disco y prelectura y consulta de la base de datos El cuello de botella de los datos reside en la E / S del disco. Cuando se utiliza un árbol binario equilibrado para realizar búsquedas basadas en un índice, se realiza una E / S cada vez que se lee un bloque de disco. Esto no se da cuenta de la lectura previa de la computadora , lo que resulta en una recuperación eficiente. El problema del árbol binario balanceado como índice se resume (en la figura anterior) Un bloque de disco representa una ubicación de almacenamiento en el disco duro):

Es demasiado profundo (es decir, tiene solo dos rutas). Cuanto mayor sea la profundidad, más operaciones de IO se realizarán. Es
demasiado pequeño. Cada IO solo consulta los datos del bloque de disco, lo que es un desperdicio de IO. El sistema operativo estipula un mínimo de 4K para una E / S y 16K para Mysql, y los bloques de disco en la figura obviamente no pueden alcanzar 4K.
Árbol B +
Para optimizar la E / S del disco y la lectura previa, reduzca las operaciones de E / S, hay muy pocas caminos, así que reemplácelos con múltiples caminos, entonces pensará en usar el árbol B y el árbol B +, pero cada nodo del árbol B está limitado a almacenar dos claves como máximo, lo que también provocará operaciones de E / S demasiado frecuentes. Por lo tanto, la idea de optimización es: leer tantos datos como sea posible en la memoria de E / S de un disco, luego también debería aparecer el árbol B +:

Un nodo de un árbol B + puede almacenar muchos índices, y solo los nodos hoja del árbol B + almacenan datos
. Hay algunas relaciones predecesoras y sucesoras entre nodos adyacentes. Los
nodos hoja están ordenados.
Inserte la descripción de la imagen aquí
En comparación con el árbol B, las ventajas del árbol B + son:

La base de datos de escaneo del árbol B + tiene una mayor capacidad para escanear tablas.
Los datos del árbol B se almacenan en cada nodo y la dirección física del nodo es aleatoria. Por lo tanto, al escanear la tabla,
los datos del árbol B + se almacenan en IO aleatorio. Para los nodos hoja, y los datos en un nodo hoja son continuos, por lo que al escanear la tabla, el orden relativo de IO

Las capacidades de lectura y escritura en disco del árbol B + son más sólidas y los nodos de sucursal no almacenan datos, pero almacenan más palabras clave. Un IO puede leer más palabras clave. El
árbol B + tiene una capacidad de clasificación más fuerte. Los datos almacenados en los nodos hoja del árbol B + ya están ordenados.
La realización del
índice es la misma en diferentes motores de almacenamiento. Los más comunes son:

El motor Innodb se refleja en el método de índice agrupado (el índice y los datos se almacenan en el mismo archivo)
El motor Myisam se refleja en el método de índice no agrupado (el índice y los datos se almacenan en dos archivos) el
método de índice agrupado (motor de almacenamiento InnoDB)
En el motor de almacenamiento InnoDB, el índice y los datos se almacenan en el mismo archivo, que es un índice agrupado. E InnoDB creará automáticamente un árbol de índice de ID de clave principal, por lo que se debe especificar la clave principal cuando se construye la tabla.

Entre ellos, el nodo hoja del índice de clave principal (índice agrupado) registra los datos, no la dirección física de los datos. El nodo hoja del índice auxiliar almacena la clave de clave primaria. Entonces, cuando use el índice auxiliar para buscar datos, verifique el índice dos veces (el índice auxiliar y el índice de clave principal):

Primero, consulte el árbol de índice secundario para encontrar la clave principal
y luego consulte los datos en función de la clave principal en el árbol de índice de clave principal.
Inserte la descripción de la imagen aquí
Método de índice no agrupado (motor de almacenamiento Myisam) En
el motor de almacenamiento Myisam, el índice y los datos se almacenan en dos archivos y pertenecen a un índice no agrupado. Independientemente de si se trata de un índice de clave principal o un índice auxiliar, sus nodos hoja son las direcciones físicas donde se registran los datos.

Inserte la descripción de la imagen aquí
Tipos de
índices de MySQL Los índices de MySQL se pueden dividir en:

Índice ordinario (índice): búsqueda acelerada
Índice único:
clave principal índice: clave principal: búsqueda acelerada + restricción (no vacía y única)
índice único: única: búsqueda acelerada + restricción (única)

Índice conjunto:
clave primaria (id, nombre): índice de clave primaria conjunta
único (id, nombre): índice de
índice único conjunto (id, nombre): índice ordinario conjunto

Índice de texto completo texto completo: funciona mejor cuando se busca un artículo extenso.
Entre ellos, comprenden principalmente los problemas del índice conjunto, la estructura de almacenamiento y los métodos de consulta.

Índice
conjunto El índice conjunto, el índice compuesto por varias columnas se denomina índice conjunto, y el índice de una sola columna es un índice conjunto especial. La estructura de almacenamiento es la siguiente:

Para un índice conjunto, su estructura de almacenamiento es solo unas pocas columnas más que un índice de valor único. Los datos de la columna del índice combinado se registran en el árbol de índices (diferentes índices combinados, árboles B + también son diferentes) y el motor de almacenamiento will first Después de ordenar una columna de índice, las otras columnas se ordenan con valores iguales sucesivamente.Inserte la descripción de la imagen aquí

NOTA: La primera fila de nodos de hoja se ordena en orden, y la segunda columna se ordenará según la primera columna, y la primera columna será igual y la siguiente columna se ordenará, y así sucesivamente.
En el modo de consulta de índice conjunto, el motor de almacenamiento busca primero desde el nodo raíz (generalmente residente en la memoria) y luego consulta en otras columnas sucesivamente, hasta que se encuentra el elemento de datos debajo del índice, que es el valor de ID, y luego los datos finales se encuentran en el árbol de índice de clave principal.

Y el principio de selección de índices conjuntos:

El principio de coincidencia de prefijos más a la izquierda (la primera columna se utiliza con frecuencia) tiene una
alta prioridad de columna de dispersión.
Primero la columna de ancho pequeño.
El principio de coincidencia de prefijos de la izquierda
está relacionado con el método de construcción del índice y la estructura de almacenamiento del índice de unión. Con base en la comprensión y el análisis anteriores, se puede concluir que el índice conjunto solo puede tener efecto cuando el índice se busca desde la primera columna del índice de varias columnas, como:

Suponga que hay un índice conjunto (a, b, c) en el usuario de la tabla, luego seleccione * del usuario donde b = 1 y c = 2 no llegarán al índice porque el índice conjunto es que el motor de almacenamiento ordena por el primer campo Luego ordene por el segundo campo, en orden.
Dispersión
Cuando la dispersión de una columna en el índice es demasiado baja, es posible que el optimizador no utilice el índice directamente. El método de cálculo de la dispersión:

= La cantidad de dispersión total de las columnas de datos no se superpone a la cantidad de datos / la columna

Índice de cobertura
Si un índice contiene (o cubre) los valores de todos los campos que deben consultarse, se denomina índice de cobertura, es decir, solo se escanea el índice sin volver a la tabla para la consulta. La cobertura de índices puede reducir la E / S de la base de datos, cambiar la E / S aleatoria en E / S secuencial y mejorar el rendimiento de las consultas.

Para el índice auxiliar InnoDB, el valor de la clave principal de la fila se almacena en el nodo hoja, por lo que si el índice auxiliar (incluido el índice conjunto) puede cubrir la consulta, se puede evitar la consulta secundaria del índice de clave principal. como:


–Crear un índice conjunto crear un índice name_phone_idx en el usuario (nombre, phoneNum); –En
este momento, es un índice de cobertura. La razón es verificar según el nombre, presionando el índice name_phone_idx,
–La clave es name, phoneNum, que ya contiene la columna de consulta.
select name, phoneNum where name = "Zhang San";
-Si id es la clave principal, también se le llama índice de cobertura en este momento. Razón: el nodo hoja del índice secundario
almacena la clave principal select id, name, phoneNum donde nombre = "Zhang San"; El
resumen del
índice MySQL tiene muchos conocimientos que dominar. He aprendido la estructura de almacenamiento subyacente del índice, la manifestación del índice en diferentes motores de almacenamiento y el análisis del conocimiento del principio básico de los tipos de índice, que pueden Proporcionar soporte de conocimientos teóricos para la posterior optimización de la base de datos. También comprenderá mejor el plan de optimización.

Dirección del enlace: https://segmentfault.com/a/1190000038346710

Supongo que te gusta

Origin blog.csdn.net/weixin_46699878/article/details/110641417
Recomendado
Clasificación