Introducción y gestión del índice MySQL series-InnoDB

Introducción y gestión del índice MySQL series-InnoDB

Operación y Mantenimiento YouthO & M Youth

Descripción de la serie de artículos

Los artículos de la serie MySQL incluyen instalación de software, uso específico, copia de seguridad y recuperación, etc., que se utilizan principalmente para registrar notas de estudio personales La versión principal de MySQL utilizada es 5.7.28 y la versión del sistema del servidor es CentOS 7.5. Este capítulo trata sobre la gestión de índices InnoDB.

índice

Definición de índice


El índice es una estructura de datos que puede ayudarnos a recuperar rápidamente datos en la base de datos. En términos sencillos, un índice es como una tabla de contenido de un libro, y podemos encontrar rápidamente lo que necesitamos a través de la tabla de contenido.

Ventajas y desventajas de la indexación


Ventajas de la indexación:

1. Puede acelerar la recuperación de datos.
2. A través de la indexación, puede utilizar hiders optimizados en el proceso de uso para mejorar el rendimiento del sistema.

Desventajas de la indexación:

1. Cuando se agregan, eliminan y modifican los datos de la tabla, el índice debe mantenerse dinámicamente, lo que reducirá la eficiencia de ejecución de la adición / cambio / eliminación.
2. El índice debe ocupar espacio físico

Clasificación de índice de índice


En MySQL InnoDB, los índices se pueden dividir en índices agrupados e índices auxiliares (índices no agrupados).

Índice agrupado

El nodo hoja del índice B + Tree almacena toda la fila de datos es el índice de clave principal, también conocido como índice agrupado. Un índice agrupado es un algoritmo que reorganiza los datos reales en el disco para ordenarlos por el valor de una o más columnas especificadas. La característica es que el orden de los datos almacenados es coherente con el orden del índice. En general, la clave principal creará un índice agrupado de forma predeterminada, y solo se permite un índice agrupado en una tabla, porque una vez que se almacenan los datos, solo puede haber un orden. Una vez que se encuentra el índice, se encuentran los datos requeridos, entonces el índice es un índice agrupado, por lo que la clave principal es el índice agrupado Modificar el índice agrupado es en realidad modificar la clave principal.

En términos generales, una tabla debe tener un índice agrupado, incluso si no está definido, InnoDB seleccionará automáticamente la columna para generar un índice:
1) Cuando haya una clave principal, cree un índice agrupado basado en la clave principal
2) Cuando no hay una clave principal, utilizará una única y no La columna de índice vacía se utiliza como clave principal y se convierte en el índice agrupado de esta tabla.
3) Si las dos anteriores no se satisfacen, entonces innodb crea un índice agrupado virtual mediante sí mismo

Si tiene la siguiente tabla:


CREATE TABLE world.student(
`id` INT AUTO_INCREMENT NOT NULL COMMENT 'id',
`name` VARCHAR(10) NOT NULL COMMENT '姓名',
`age` INT  NOT NULL COMMENT '年龄',
PRIMARY KEY(id),
INDEX idx_name(NAME)
)ENGINE=INNODB DEFAULT CHARSET='utf8mb4';

INSERT INTO world.`student`(NAME,age) VALUES('张三',24),('李四',20),('王五',21),('运维少年',18);

Introducción y gestión del índice MySQL series-InnoDB

La estructura del índice agrupado es la siguiente:
Introducción y gestión del índice MySQL series-InnoDB
proceso de búsqueda de índice agrupado:
Introducción y gestión del índice MySQL series-InnoDB

Índice auxiliar

El nodo hoja del índice B + Tree solo almacena el valor de la clave principal y la columna de índice es un índice de clave no principal, que también se denomina índice no agrupado. Una tabla puede tener varios índices no agrupados. El almacenamiento de índices no agrupados está separado del almacenamiento de datos. Es decir, el índice se puede encontrar pero no se encuentran datos. Es necesario volver a consultar la tabla en función del valor (clave principal) del índice. Los índices no agrupados también se denominan índices secundarios.

La estructura de datos del índice del grupo auxiliar en la tabla de estudiantes: El
Introducción y gestión del índice MySQL series-InnoDB
proceso de búsqueda de datos del índice del grupo auxiliar (no volver a la tabla):
Introducción y gestión del índice MySQL series-InnoDB

Proceso de búsqueda de datos de índice de grupo auxiliar (volver a la tabla):
Introducción y gestión del índice MySQL series-InnoDB

Índice auxiliar índice de una sola columna


Índice de una sola columna, es decir, usa una columna como columna de índice auxiliar, pero cuando la condición de consulta usa la columna de índice auxiliar, se usará el índice.

Índice auxiliar índice de varias columnas (índice conjunto)


Índice conjunto, es decir, índice de varias columnas, al crear un índice, utilice varias columnas como columnas de índice, como por ejemplo:


alter table student add index idx_na(name,age);

Índice auxiliar índice de varias columnas (índice conjunto)


El índice de prefijo está dirigido, la longitud del valor de la columna de índice que elegimos es demasiado larga, lo que hará que la altura del índice aumente, lo que hará que se lean más páginas de datos de índice cuando se aplique el índice. MySQL recomienda que la altura del árbol índice es de 3-4 capas. Por lo tanto, puede seleccionar la primera parte del campo grande como condición de generación de índice.
Al igual que el título de un libro, el título no puede ser demasiado largo. Si el título es demasiado largo, cuando se genera la tabla de contenido, la tabla de contenido ocupa mucho espacio y la página de la tabla de contenido aumentará. El índice de prefijo se usa generalmente para consultas difusas.

Si tiene la siguiente tabla, debe usar la columna sno como columna de índice. A través de la comparación, puede ver que los primeros 6 caracteres pueden determinar un valor único. Por lo tanto, al crear un índice, puede establecer la longitud del prefijo en 6 para reducir la altura del árbol índice.
Introducción y gestión del índice MySQL series-InnoDB


alter table xxx add index index_name(sno(2));

Gestión de índices

Ver índice:


show index from world.student;

Introducción y gestión del índice MySQL series-InnoDB
Introducción y gestión del índice MySQL series-InnoDB

Eliminar índice:


drop index idx_name on world.student;

Introducción y gestión del índice MySQL series-InnoDB

Crear índice:

Método común 1: crear al crear una tabla


CREATE TABLE world.student(
`id` INT AUTO_INCREMENT NOT NULL COMMENT 'id',
`name` VARCHAR(10) NOT NULL COMMENT '姓名',
`age` INT  NOT NULL COMMENT '年龄',
PRIMARY KEY(id),  # 聚簇索引
INDEX idx_name(name)  # 辅助索引
)ENGINE=INNODB DEFAULT CHARSET='utf8mb4';

Método común 2: use la instrucción alter


alter table world.student add index idx_name(name);

Introducción y gestión del índice MySQL series-InnoDB

¿Cuándo se crea el índice?

1) Cree un índice adecuado de acuerdo a las necesidades de la declaración comercial, no todas las columnas están indexadas
2) No todas las columnas están indexadas, no es que cuantos más índices mejor
3) El índice se construye en el proceso para hacer donde agrupar por orden por unirse a la columna condicional

¿Las consecuencias de una indexación desordenada?

1) Si hay demasiados índices redundantes, cuando los datos de la tabla cambian, es probable que los índices se actualicen con frecuencia. Bloqueará muchas solicitudes comerciales normales
2) Demasiados índices harán que el optimizador elija desviaciones

Especificación de la aplicación de índice:

1. Al crear la tabla, debe haber una clave principal. La clave principal es preferiblemente una columna numérica. De lo contrario, puede personalizar una columna irrelevante y definirla como crecimiento propio.
2. Al seleccionar el
índice único , el valor del índice único es único y puede cambiarlo. Utilice rápidamente el índice para determinar el
campo único de un registro , como el número de la escuela intermedia de la tabla de estudiantes. El establecimiento de un índice único para este campo puede determinar rápidamente la información de un estudiante determinado Si se cambia el nombre, puede producirse el fenómeno del mismo nombre, lo que reduce la velocidad de consulta.
3. Para los campos que a menudo requieren operaciones como dónde, ordenar por, agrupar por, unirse, etc., la clasificación desperdiciará mucho tiempo. Se pueden establecer índices para optimizar las consultas. Si las columnas se usan a menudo como condiciones y no hay demasiados valores duplicados, se puede establecer un índice conjunto.
4. Use el índice de prefijo tanto como sea posible. Si el valor del campo de índice es muy largo, es mejor usar el prefijo del valor para indexar.
5. Límite el número de
índices. El número de índices no es tanto como sea posible. Problemas que pueden surgir
1) Cada índice es necesario. Ocupe espacio en disco, mientras más índices, más espacio en disco se necesita.
2) Al modificar la tabla, es difícil reconstruir y actualizar el índice. Cuantos más índices, la actualización de la tabla se convertirá en una pérdida de tiempo.
3) El optimizador La carga será pesada, lo que puede afectar la elección del optimizador.
Hay una herramienta en percona-toolkit que analiza específicamente si el índice es útil
6, elimina los índices que ya no se usan o que se usan con poca frecuencia
7 y agrega índices a tablas grandes. Operación durante períodos de
mucha actividad 8. Trate de construir lo menos posible en la columna de valor actualizado

Suplemento de índice

Formulario de preparación complementario



CREATE TABLE world.student(
`id` INT AUTO_INCREMENT NOT NULL COMMENT 'id',
`name` VARCHAR(10) NOT NULL COMMENT '姓名',
`age` CHAR(3)  NOT NULL COMMENT '年龄',
`address` VARCHAR(20) NOT NULL COMMENT '地址',
`phone` VARCHAR(11) NOT NULL COMMENT '手机号码',
PRIMARY KEY(id),
INDEX idx_info(age,NAME,address)
)ENGINE=INNODB DEFAULT CHARSET='utf8mb4';

INSERT INTO world.`student`(NAME,age,address,phone) VALUES('张三',24,'北京市','10086'),('李四',20,'上海市','10000'),('王五',21,'重庆市','10010'),('运维少年',18,'天津市','13800138000');

¿Cómo comprobar si SQL está indexado o no?


Método 1: explicar


explain 执行的语句
explain select * from student where id=1;

Método 2: desc


desc 执行的语句
desc select * from student where name='张三'

Introducción y gestión del índice MySQL series-InnoDB
Introducción y gestión del índice MySQL series-InnoDB

Tipo de escaneo de índice complementario


1) índice de escaneo de índice completo: es necesario escanear todo el árbol de índice

El escaneo de índice completo del índice generalmente ocurre cuando la columna de consulta es una columna de índice


select id from student;

Introducción y gestión del índice MySQL series-InnoDB

2) rango - escaneo de rango

Cuando las condiciones de la consulta son>, <, en, como, el tipo será rango
Introducción y gestión del índice MySQL series-InnoDB
Introducción y gestión del índice MySQL series-InnoDB
Introducción y gestión del índice MySQL series-InnoDB

3) consulta equivalente de índice auxiliar ref

La consulta equivalente de índice auxiliar generalmente se produce cuando se utilizan columnas de índice auxiliar para una consulta equivalente.
Introducción y gestión del índice MySQL series-InnoDB

4) Consulta equivalente de clave principal de Const

La consulta equivalente de índice agrupado generalmente se produce cuando se utilizan columnas de índice agrupadas para realizar una consulta equivalente.
Introducción y gestión del índice MySQL series-InnoDB

¿En qué circunstancias no se agregará el índice?


1) Sin condiciones de consulta
Introducción y gestión del índice MySQL series-InnoDB

2) Al consultar el conjunto de resultados, la mayoría de los datos en la tabla original deben ser del 15% al ​​30%. Si excede, el optimizador siente que no hay necesidad de indexar. Puede usar limi paging.
Introducción y gestión del índice MySQL series-InnoDB
3) La condición de la consulta pertenece a la función en la columna de índice. O realice operaciones en la columna de índice, la operación incluye (+ - /! etc.)
Ejemplo incorrecto: seleccione
de ID de estudiante-1 = 2;
Ejemplo correcto: seleccione * de ID de estudiante = 3 ;
Introducción y gestión del índice MySQL series-InnoDB
4) La conversión implícita hace que el índice falle. Este punto debe tomarse en serio y este error se comete a menudo. Si se define char, se utiliza el tipo numérico al realizar consultas.
Introducción y gestión del índice MySQL series-InnoDB
5) no en no toma el índice auxiliar. o o en se puede cambiar a la unión
Introducción y gestión del índice MySQL series-InnoDB
6) como "% _" no va delante del signo de porcentaje
Introducción y gestión del índice MySQL series-InnoDB

Suplemento de índice de varias columnas (índice conjunto)


Utilice varias columnas para combinar un idx de índice (edad, nombre, dirección)

Índice válido: edad edad, nombre edad, nombre, dirección (solo comenzando con edad y continuo)
Índice no válido: nombre dirección nombre, dirección
Introducción y gestión del índice MySQL series-InnoDB

El índice solo puede ir igual y no puede ir a valores de rango:

1、age= and name= and address=  #索引能到address
2、age= and name> and address= # 索引能到name
3、age< and name = and address= # 索引能到a

Introducción y gestión del índice MySQL series-InnoDB
Introducción y gestión del índice MySQL series-InnoDB

Supongo que te gusta

Origin blog.51cto.com/15082392/2656023
Recomendado
Clasificación