Ajuste del rendimiento de mysql (6)

Prefacio

  En primer lugar, me gustaría pedir disculpas a todos porque me he estado preparando para el Examen Nacional Grid el mes pasado, el tiempo es escaso y la tarea es pesada, por lo que no ha habido tiempo para actualizar. Ayer participé en la entrevista con State Grid y ahora estoy esperando el resultado. Recientemente actualizaré tanto como sea posible , pero aún garantizaré la calidad del artículo . Compartiré el conocimiento que he aprendido con ustedes en forma de blog, para que todos puedan leer mis artículos y obtener muchas recompensas.
  En el artículo anterior, presentamos los pasos específicos para optimizar declaraciones SQL , incluida la verificación de la frecuencia de ejecución de SQL, localizar la ejecución de baja eficiencia de SQL, explicar el análisis del plan de ejecución, analizar SQL a través de show profile y finalmente analizar el plan de ejecución. del optimizador a través del seguimiento. El siguiente artículo le presentará el uso específico de índices en mysql.
  En el artículo anterior también presentamos el índice de conceptos básicos y el uso básico del índice. De hecho, la indexación es uno de los medios técnicos más utilizados y más importantes para la optimización de bases de datos. La indexación generalmente puede ayudar a los usuarios a resolver la mayoría de los problemas de optimización del rendimiento de MySQL. A continuación, le presentaremos la declaración que verifica el índice en mysql para mejorar la eficiencia de la consulta.

1. Verifique el índice para mejorar la eficiencia de las consultas

  Realizamos consultas de ID en una tabla de big data y los datos de esta tabla han alcanzado los 3 millones de registros.

select * from tb_item where id = 1999\G;

  Cuando miramos los resultados de su ejecución,

  podemos ver claramente que su velocidad de consulta es muy rápida, cercana a 0. La razón principal es que id es la clave principal y se agrega un índice por defecto . Usamos la siguiente declaración para verificar el índice de nuestra clave principal;

explain select * from tb_item where id = 1999\G;

  Observamos los resultados de su ejecución,

  si consultamos de acuerdo con su nombre, entonces miramos el plan de ejecución de esta declaración.

explain select * from tb_item where title = 'iphonex 移动3G 32G941'\G;

  Cuando miramos los resultados de su ejecución,

  podemos ver claramente que lleva una cierta cantidad de tiempo consultar una columna que no está indexada. Construimos un índice para la clase de título; la declaración es la siguiente:

create index idx_item_title on tb_item(title);

  Después de ver los resultados de su ejecución y

  crear el índice, volvemos a consultar el título:

select * from tb_item where title = 'iphonex 移动4G 64G944'\G;

  Comprobamos los resultados de su ejecución

  Para que el contenido que introducimos se desarrolle sin problemas, crearemos una tb_sellertabla para todos e insertaremos algunos datos como la tabla de nuestro experimento. Nuestro motor de almacenamiento todavía usa el valor predeterminado innodb. La declaración de creación de tabla específica es la siguiente:

create table `tb_seller`(
	`sellerid` varchar (100),
	`name` varchar(100),
	`nickname` varchar (50),
	`password` varchar (60),
	`status` varchar (1),
	`address` varchar (100),
	`createtime` datetime,
	primary key(`sellerid`)
) engine=innodb default charset=utf8mb4;

  A continuación, tb_sellerinsertamos datos para la tabla, la declaración específica es la siguiente:

insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`)
values ('xiaomi', '小米科技', '小米官方旗舰店','e10adc3949ba59abbe56e057f20f883e', '1', '西安市', '2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`)
values ('yijia', '宜家家居', '宜家家居旗舰店','e10adc3949ba59abbe56e057f20f883e', '1', '北京市', '2088-01-01 12:00:00');

  Los siguientes datos son consistentes con el código anterior, para ahorrar tiempo, se los daremos en forma de imágenes. Insertan datos específicos de la siguiente manera:

  A continuación, vamos name, status, addresstres campos para crear el índice, en particular, para alcanzar la siguiente declaración:

create index idx_seller_name_sta_addr on tb_seller(name, status, address);

  A continuación, presentaré varias formas de evitar fallas en el índice.

2. Evite fallas en el índice

  1), coincidencia de valor completo , especifique valores específicos para todas las columnas del índice. En este caso, el índice entra en vigor y la eficiencia de ejecución es mayor.

explain select * from tb_seller where name = '小米科技' and status = '1' and address = '北京市'\G; 

  Los efectos de implementación específicos son los siguientes:

  2), la regla del prefijo más a la izquierda . Si indexa varias columnas, siga la regla de prefijo más a la izquierda. Significa que la consulta comienza desde la columna frontal más a la izquierda del índice y no omite las columnas del índice . A lo que debemos prestar atención es a que la regla de hacer coincidir el prefijo más a la izquierda está indexada.

explain select * from tb_seller where name = '小米科技'; 

  Los efectos de implementación específicos son los siguientes:

  3) La columna a la derecha de la consulta de rango no puede usar el índice .

explain select * from tb_seller where name = '小米科技' and status = '1' and address = '北京市'; 

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where name = '小米科技' and status > '1' and address = '北京市'; 

  El efecto de implementación específico es el siguiente:

  De acuerdo con los dos campos anteriores, la consulta de estado está indexada. Pero la dirección de la última condición es un índice inútil.
  4) No realice operaciones de cálculo en la columna de índice, el índice no será válido.

select * from tb_seller where substring(name, 3,2) = '科技';

  Los efectos de implementación específicos son los siguientes:

   5) La cadena no agrega comillas simples, lo que hace que el índice deje de ser válido.

explain select * from tb_seller where name = '科技' and status = '0';

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where name = '科技' and status = 0;

  Los efectos de implementación específicos son los siguientes:

   6), intente utilizar el índice de cobertura, evite seleccionar. Intente utilizar un índice de cobertura (consulta que solo acceda al índice (la columna de índice contiene completamente la columna de consulta)) y reduzca la selección *.

explain select * from tb_seller where name = '科技' and status = '0' and address = '西安市';

  Los efectos de implementación específicos son los siguientes:

explain select name from tb_seller where name = '科技' and status = '0' and address = '西安市';

  Los efectos de implementación específicos son los siguientes:

explain select name,status from tb_seller where name = '科技' and status = '0' and address = '西安市';

  Los efectos de implementación específicos son los siguientes:

explain select name,status, address from tb_seller where name = '科技' and status = '0' and address = '西安市';

  El efecto de implementación específico es el siguiente:

  si la columna de la consulta excede la columna del índice, el rendimiento también se reducirá.

explain select status, address, password from tb_seller where name = '科技' and status = '0' and address = '西安市';

  La implementación específica de los resultados es el siguiente:

  en la implementación de la olla, podemos ver a diferentes nombres de índice en la columna Adicional, parte de Using index,, using where, using index condition, using index; using wherevamos a explicar a usted el significado de cada uno de estos cuatro tipos de índices.

  usando índice : cuando se usa un índice de cobertura, se usará
  dónde : en el caso de buscar y usar un índice, debe volver a la tabla para consultar los datos requeridos
  usando la condición de índice : buscar usando un índice, pero necesita para volver a la tabla para consultar los datos
  usando el índice; usando donde : La búsqueda usa un índice, pero los datos requeridos se pueden encontrar en la columna del índice, por lo que no es necesario volver a la tabla para consultar los datos.

   7). Separe la condición con o. Si la columna en la condición anterior o tiene un índice, pero no hay un índice en la siguiente columna, entonces el índice involucrado no se utilizará.
  Usemos un ejemplo para explicar el principio anterior para todos. El campo de nombre es una columna de índice y createtime no es una columna de índice. El medio está o está conectado sin indexación;

explain select * from tb_seller where name = '黑马程序员' and createtime = '2088-01-01 12:00:00'\G;

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where name = '黑马程序员' or createtime = '2088-01-01 12:00:00'\G;

  El efecto de ejecución específico es el siguiente:

   8) Como una consulta difusa que comienza con%, el índice no es válido. Si solo la cola es una coincidencia aproximada, el índice no se invalidará. Si el encabezado tiene una coincidencia aproximada, el índice no es válido.

explain select * from tb_seller where name like '黑马程序员%';

  Los efectos de implementación específicos son los siguientes:

   9) Si MySQL evalúa que el uso de índices es más lento que el de la tabla completa, entonces los índices no se usan.

explain select * from tb_seller where address = '北京市';

  Los efectos de implementación específicos son los siguientes:

create index idx_address on tb_seller(address);

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where address = '北京市';

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where address = '西安市';

  Los efectos de implementación específicos son los siguientes:

   10), es NULL, NO es NULL a veces el índice falla.

explain select * from tb_seller where name is null;

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where name is not null;

  Los efectos de implementación específicos son los siguientes:

explain select * from t_user where name is null;

  Los efectos de implementación específicos son los siguientes:

explain select * from t_user where name is not null;

  Los efectos de implementación específicos son los siguientes:

   11) En toma índice, no en índice no es válido.

explain select * from tb_seller where sellerid in ('oppo', 'xiaomi', 'sina');

  Los efectos de implementación específicos son los siguientes:

explain select * from tb_seller where sellerid not in ('oppo', 'xiaomi', 'sina');

  Los efectos de implementación específicos son los siguientes:

   12), índice de una sola columna e índice compuesto. Intente utilizar índices compuestos y menos índices de una sola columna. Crea un índice compuesto.

create index idx_name_sta_address on tb_seller(name, status, address);

   Esta declaración equivale a crear tres índices:
  nombre
  nombre + estado
  nombre + estado + dirección

  Crea un índice de una sola columna

create index idx_seller_name on tb_seller(name);
create index idx_seller_name on tb_seller(status);
create index idx_seller_name on tb_seller(address);

  La base de datos elegirá un índice óptimo para usar y no usará todos los índices.

3. Verifique el uso del índice

show status like 'Handler_read%';
show global status like 'Handler_read%';

  El efecto de ejecución específico es el siguiente:

  Desde la perspectiva del efecto de ejecución, hay algunos nombres de variables en la tabla ejecutada A continuación, presentaremos el significado específico de estos nombres de variables.

  Handler_read_first : el número de veces que se ha leído la primera entrada del índice. Si es más alto, significa que el servidor está realizando una gran cantidad de escaneos de índice completos (cuanto menor sea el valor, mejor )
  Handler_read_key : si el índice está funcionando, este valor representa el número de veces que el índice lee una fila valor, si el valor es menor. Indica que la mejora del rendimiento del índice no es alta, porque el índice no se usa con frecuencia (cuanto mayor sea el valor, mejor ).
  Handler_read_next : el número de solicitudes para leer la siguiente línea en orden de clave. Si usa restricciones de rango o si realiza un escaneo de índice para consultar columnas indexadas, el valor aumenta.
  Handler_read_prev : el número de solicitudes para leer la línea anterior en orden de clave. Este método de lectura está optimizado principalmente para ORDER BY ... DESC.
  Handler_read_rnd : el número de solicitudes para leer una línea de acuerdo con una posición fija. Si está ejecutando una gran cantidad de consultas y necesita ordenar los resultados, este valor es mayor. Puede usar muchas consultas que requieren que MySql escanee toda la tabla o su conexión puede no usar las claves correctamente. Este valor es relativamente alto, lo que significa que la eficiencia operativa es baja y se debe establecer un índice para remediarlo.
  Handler_read_rnd_next : el número de solicitudes para leer la siguiente línea en el archivo de datos. Si está realizando una gran cantidad de escaneos de tablas, este valor es mayor. Por lo general, significa que el índice de su tabla es incorrecto o que la consulta escrita no hace uso del índice.

para resumir

  En el artículo anterior, optimizamos los pasos específicos de la declaración sql , incluida la verificación de la frecuencia de ejecución de sql, la localización de la ejecución ineficiente de sql, el análisis de explicación del plan de ejecución, el análisis de sql a través de show profile y, finalmente, el análisis del plan de ejecución del optimizador a través de trace. y otros conocimientos relacionados. Este artículo le presenta el uso específico de índices en mysql. El siguiente artículo le presentará la optimización de sql. Por lo tanto, mysql es una habilidad muy importante. Casi todos los trabajos en la computadora necesitan una habilidad de mysq. Por lo tanto, necesitamos un dominio especial. La vida es interminable y la lucha es interminable Trabajamos duro todos los días, estudiamos mucho, mejoramos constantemente nuestras habilidades y creemos que aprenderemos algo. ¡Vamos! ! !

Supongo que te gusta

Origin blog.csdn.net/Oliverfly1/article/details/111088289
Recomendado
Clasificación