Tabla de registros de información estadística | Una comprensión completa de la biblioteca del sistema mysql

En el último número de "Tabla de registros de información de objetos de base de datos | Una comprensión completa de la biblioteca del sistema MySQL" , presentamos en detalle la tabla de registros de metadatos en la biblioteca del sistema mysql. En este número, le presentaremos la cuarta parte de la serie "Registro de estadísticas Tabla | Una comprensión completa de la biblioteca del sistema mysql ", síganos para comenzar el viaje de aprendizaje del sistema de la biblioteca del sistema mysql.

1 | Resumen de estadísticas

Cómo configurar la optimización de la persistencia de estadísticas.

  • La función de estadísticas persistentes es almacenar las estadísticas en la memoria en el disco total, para que pueda volver a leer rápidamente estas estadísticas cuando la base de datos se reinicia sin volver a ejecutar las estadísticas, de modo que el optimizador de consultas pueda usar estas estadísticas persistentes. Seleccione el plan de ejecución con precisión (si no hay tal información estadística persistente, la información estadística en la memoria se perderá después de que se reinicie la base de datos. La próxima vez que acceda a una tabla en una biblioteca, la información estadística debe volver a calcularse, y el nuevo cálculo puede ser Debido a la diferencia en los valores estimados, el plan de consulta cambia, lo que puede generar cambios en el rendimiento de la consulta. ¿Qué sucede si la función de persistencia de la información estadística está habilitada? Cuando innodb_stats_persistent = ON o la opción de creación de tabla STATS_PERSISTENT = 1 se usa cuando se construye la tabla, significa que la función de persistencia de las estadísticas está activada (tenga en cuenta que lo último significa que solo se conservan las estadísticas de una sola tabla e independientemente de si el parámetro innodb_stats_persistent está habilitado, el primero Representa para habilitar la persistencia de estadísticas para todas las tablas globalmente. La variable de sistema innodb_stats_persistent está habilitada por defecto. Si desea desactivar la función de estadísticas persistentes de una tabla individualmente, puede modificarla a través de la instrucción ALTER TABLE tbl_name STATS_PERSISTENT = 0).

  • Las estadísticas persistentes se almacenan en las tablas mysql.innodb_table_stats y mysql.innodb_index_stats. El primero almacena estadísticas relacionadas con la estructura de la tabla y filas de datos, y el segundo almacena estadísticas relacionadas con valores de índice.

Cómo configurar la persistencia de estadísticas para optimizar los cálculos automáticos.

  • La variable de sistema innodb_stats_auto_recalc controla si se habilita el cálculo automático de información estadística. Está habilitada por defecto. Cuando la función de cálculo automático está habilitada, el cálculo automático de información estadística se activará cuando la cantidad de datos en la tabla cambie en más del 10%. Si la variable innodb_stats_auto_recalc no está habilitada, también puede usar la cláusula STATS_AUTO_RECALC en la instrucción CREATE TABLE o ALTER TABLE para configurar el recálculo automático de estadísticas para una sola tabla.

  • El recálculo automático se ejecuta en segundo plano, por lo que incluso si la variable de sistema innodb_stats_auto_recalc está habilitada, es posible que las estadísticas no se vuelvan a calcular inmediatamente después de que la operación DML de los datos en la tabla supere el 10%. En algunos casos, puede demorarse unos segundos, si es necesario Si las estadísticas son precisas, puede ejecutar manualmente la instrucción ANALYZE TABLE para garantizar la precisión de las estadísticas del optimizador.

  • Cuando se agrega un nuevo índice a una tabla, independientemente del valor del parámetro del sistema innodb_stats_auto_recalc, activará el recálculo de las estadísticas del índice y las agregará a la tabla innodb_index_stats. Pero debe tenerse en cuenta que lo que se menciona aquí es activar el recálculo de las estadísticas del índice, no las estadísticas relacionadas con la tabla y sus datos en la tabla mysql.innodb_table_stats. Si desea agregar el índice, las estadísticas relacionadas con los datos se actualizarán a mysql al mismo tiempo. En la tabla innodb_table_stats, debe habilitar la variable del sistema innodb_stats_auto_recalc o modificar la opción innodb_stats_auto_recalc de la tabla, o ejecutar la instrucción ANALYZE TABLE en la tabla.

Cómo configurar la optimización de persistencia de estadísticas para una sola tabla.

  • innodb_stats_persistent, innodb_stats_auto_recalc e innodb_stats_persistent_sample_pages son variables globales del sistema. Si necesita ignorar el valor de la variable global y especificar por separado si una tabla debe configurarse con estadísticas persistentes, puede usar las opciones de creación de la tabla (cláusulas STATS_PERSISTENT, STATS_AUTO_RECALC y STATS_SAMPLE_PAGES) para anular el valor establecido por la variable del sistema para crear una tabla Las opciones se pueden especificar en la instrucción CREATE TABLE o ALTER TABLE.

    * STATS_PERSISTENT: especifique si desea habilitar las estadísticas persistentes para las tablas InnoDB. Si no se establece, el valor predeterminado es DEFAULT, lo que significa que la configuración de la función de estadísticas persistentes de la tabla está determinada por la variable de sistema innodb_stats_persistent. Si se establece en 1, significa que las estadísticas persistentes de la tabla están habilitadas, y si se establece, significa que la función de estadísticas persistentes de esta tabla está desactivada. Si la función de estadísticas persistentes está habilitada a través de la instrucción CREATE TABLE o ALTER TABLE, se llamará a la instrucción ANALYZE TABLE para calcular las estadísticas después de que los datos representativos se carguen en la tabla.

    * STATS_AUTO_RECALC: especifique si se recalcularán automáticamente las estadísticas persistentes de la tabla InnoDB. El valor predeterminado es DEFAULT, lo que significa que la función de recálculo de las estadísticas persistentes de la tabla está determinada por el valor de la variable de sistema innodb_stats_auto_recalc. Cuando se establece en 1, significa que la función de recálculo automático está habilitada. Después de la activación, las estadísticas se volverán a calcular cuando cambie el 10% de los datos de la tabla. Cuando se establece en 0, significa cerrar el recálculo automático de estadísticas para la tabla. Debe tenerse en cuenta que si los datos de la tabla han cambiado significativamente después del cierre, ejecute manualmente la instrucción ANALYZE TABLE para recalcular las estadísticas. De lo contrario, el plan de ejecución puede ser inexacto debido a información estadística inexacta.

    * STATS_SAMPLE_PAGES: Establezca el número de páginas de índice que se muestrearán al estimar la cardinalidad de la columna de índice y otros datos estadísticos (por ejemplo: el número de páginas de muestreo necesarias para el cálculo de ANALYZE TABLE).

  • A continuación, se muestran ejemplos del uso de estas tres opciones de creación de tablas:

CREATE TABLE `t1` (
`id` int(8) NOT NULL auto_increment,
`data` varchar(255),
`date` datetime,
PRIMARY KEY (`id`),
INDEX `DATE_IX` (`date`)
) ENGINE=InnoDB,
  STATS_PERSISTENT=1,
  STATS_AUTO_RECALC=1,
  STATS_SAMPLE_PAGES=25;

Cómo configurar el número de páginas de muestreo para las estadísticas del optimizador InnoDB.

  • El optimizador de consultas MySQL utiliza información estadística sobre el valor clave del índice para calcular la selectividad del índice y selecciona el índice del plan de ejecución en función de la selectividad. Entonces, ¿de dónde provienen estas estadísticas? Por ejemplo: al realizar operaciones como ANALIZAR TABLA, InnoDB extraerá páginas aleatorias de cada índice de la tabla para estimar la cardinalidad del índice. (Esta técnica se denomina muestreo aleatorio.) El número de páginas de muestra se establece mediante el parámetro del sistema innodb_stats_persistent_sample_pages, y el valor predeterminado es 20, que es una variable dinámica. Normalmente, no hay necesidad de modificarlo. Incrementar la configuración de esta variable puede resultar en un tiempo de muestreo más largo (porque es necesario leer más páginas), pero si se determina que el número predeterminado de muestras genera estadísticas de índice inexactas, puede intentarlo gradualmente Aumente el valor de esta variable del sistema hasta que tenga estadísticas suficientemente precisas. La precisión de las estadísticas se puede verificar comparando el valor devuelto por SELECT DISTINCT (index_name) con el valor estimado proporcionado en la tabla de estadísticas persistentes mysql.innodb_index_stats.

Cómo configurar para incluir registros marcados eliminados en el cálculo de estadísticas persistentes.

  • De forma predeterminada, InnoDB lee los datos no confirmados al calcular las estadísticas. Para las transacciones no confirmadas que eliminan filas de la tabla, InnoDB ignora estos registros eliminados al estimar las estadísticas de filas e índices, por lo que esto puede llevar al plan de ejecución de otras transacciones que realizan consultas paralelas en la tabla. No es preciso. Para evitar esta situación, puede habilitar el parámetro del sistema innodb_stats_include_delete_marked para asegurarse de que InnoDB incluya registros marcados para su eliminación al calcular estadísticas persistentes. Cuando innodb_stats_include_delete_marked está habilitado, los registros marcados para su eliminación se contarán cuando se ejecute la instrucción ANALYZE TABLE. Cabe señalar que: innodb_stats_include_delete_marked es una variable global y una tabla no puede establecerse por separado Innodb_stats_include_delete_marked se introdujo en MySQL 5.7.16.

La persistencia de las estadísticas depende de las tablas innodb_table_stats e innodb_index_stats de la base de datos mysql, que se configuran automáticamente durante la instalación, actualización y construcción del código fuente.

  • Las tablas innodb_table_stats e innodb_index_stats contienen la columna last_update, que indica el momento en que InnoDB actualizó por última vez las estadísticas del índice.

  • Las tablas innodb_table_stats e innodb_index_stats son tablas normales y se pueden actualizar manualmente. Mediante la función de actualizar manualmente las estadísticas, puede aplicar planes de optimización de consultas específicos o probar planes alternativos sin modificar la base de datos. Nota: Si actualiza manualmente las estadísticas, debe ejecutar el comando FLUSH TABLE tbl_name para que MySQL vuelva a cargar las estadísticas actualizadas.

  • Las estadísticas persistentes se consideran información local porque están relacionadas con la propia instancia. Por lo tanto, los cambios de datos estadísticos automáticos de las tablas innodb_table_stats e innodb_index_stats no se replicarán entre las arquitecturas primaria y en espera. Pero si la instrucción ANALYZE TABLE se ejecuta manualmente para activar el recálculo de estadísticas, la declaración ANALYZE TABLE en sí se replicará entre las arquitecturas primaria y en espera para iniciar la operación de recálculo de sincronización de las estadísticas en la base de datos en espera (a menos que se establezca durante la operación de la base de datos principal Declaraciones como set sql_log_bin = 0 desactivan el registro).

2 | Tabla de información estadística detallada

2.1. innodb_table_stats

Esta tabla proporciona información estadística relacionada con los datos de la tabla de consulta.

La siguiente es la información almacenada en la tabla.

root@localhost : test 08:00:46> use mysql
Database changed
root@localhost : mysql 08:01:30> select * from innodb_table_stats where table_name='test'\G
*************************** 1. row ***************************
           database_name: test
              table_name: test
             last_update: 2018-05-24 20:00:50
                  n_rows: 6
    clustered_index_size: 1
sum_of_other_index_sizes: 2
1 row in set (0.00 sec)

Significado del campo de la tabla.

  • database_name: nombre de la base de datos.

  • table_name: nombre de la tabla, nombre de la partición o nombre de la subpartición.

  • last_update: indica la marca de tiempo de la última vez que InnoDB actualizó esta fila de estadísticas.

  • n_rows: el número de filas de registros de datos estimados en la tabla.

  • clustered_index_size: el tamaño del índice de clave principal, el valor estimado en unidades de página.

  • sum_of_other_index_sizes: El tamaño total de otros índices (clave no primaria), el valor estimado en páginas.

2.2. innodb_index_stats

Esta tabla proporciona información estadística relacionada con los índices de consulta.

La siguiente es la información almacenada en la tabla.

root@localhost : mysql 08:01:34> select * from innodb_index_stats where table_name='test';
+---------------+------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name | index_name | last_update | stat_name | stat_value | 
sample_size | stat_description |
+---------------+------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
| test | test | PRIMARY | 2018-05-24 20:00:50 | n_diff_pfx01 | 5 | 1 | a |
| test | test | PRIMARY | 2018-05-24 20:00:50 | n_diff_pfx02 | 6 | 1 | a,b |
| test | test | PRIMARY | 2018-05-24 20:00:50 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| test | test | PRIMARY | 2018-05-24 20:00:50 | size | 1 | NULL | Number of pages in the index |
| test | test | i1 | 2018-05-24 20:00:50 | n_diff_pfx01 | 5 | 1 | c |
| test | test | i1 | 2018-05-24 20:00:50 | n_diff_pfx02 | 5 | 1 | c,d |
| test | test | i1 | 2018-05-24 20:00:50 | n_diff_pfx03 | 6 | 1 | c,d,a |
| test | test | i1 | 2018-05-24 20:00:50 | n_diff_pfx04 | 6 | 1 | c,d,a,b |
| test | test | i1 | 2018-05-24 20:00:50 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| test | test | i1 | 2018-05-24 20:00:50 | size | 1 | NULL | Number of pages in the index |
| test | test | i2uniq | 2018-05-24 20:00:50 | n_diff_pfx01 | 6 | 1 | e |
| test | test | i2uniq | 2018-05-24 20:00:50 | n_diff_pfx02 | 6 | 1 | e,f |
| test | test | i2uniq | 2018-05-24 20:00:50 | n_leaf_pages | 1 | NULL | Number of leaf pages in the index |
| test | test | i2uniq | 2018-05-24 20:00:50 | size | 1 | NULL | Number of pages in the index |
+---------------+------------+------------+---------------------+--------------+------------+-------------+-----------------------------------+
14 rows in set (0.00 sec)

Significado del campo de la tabla.

  • database_name: nombre de la base de datos.

  • table_name: nombre de la tabla, nombre de la tabla de partición, nombre de la tabla de la subpartición.

  • index_name: nombre del índice.

  • last_update: indica la marca de tiempo de la última vez que InnoDB actualizó esta fila de estadísticas.

  • stat_name: el nombre de la información estadística y el valor de la información estadística correspondiente se almacenan en la columna stat_value.

  • stat_value: Guarda el valor de la información estadística correspondiente a la columna stat_name del nombre de la información estadística.

  • sample_size: el número de páginas de muestreo para la información estadística estimada proporcionada en la columna stat_value.

  • stat_description: La información descriptiva de la información estadística especificada en la columna stat_name del nombre de la información estadística.

A partir de los datos obtenidos de la consulta en la tabla, podemos ver:

  • La columna stat_name tiene los siguientes valores estadísticos.

    * tamaño: cuando stat_name es el valor de tamaño, el valor de la columna stat_value representa el número total de páginas en el índice.

    * n_leaf_pages: cuando stat_name es el valor de n_leaf_pages, el valor de la columna stat_value muestra el número de páginas de índice.

    * n_diff_pfxNN: NN representa un número (por ejemplo: 01, 02, etc.). Cuando stat_name es n_diff_pfxNN, el valor de la columna stat_value muestra la primera columna del índice (es decir, la primera columna del índice, comenzando desde la primera columna del orden de definición del índice). El número de valores únicos, por ejemplo: cuando NN es 01, el valor de la columna stat_value representa el número de valores únicos en la primera columna del índice. Cuando NN es 02, el valor de la columna stat_value representa la combinación de la primera y la segunda columna del índice. El número de valores únicos, etc. Además, en el caso de stat_name = n_diff_pfxNN, la columna stat_description muestra una lista de columnas separadas por comas para calcular las estadísticas del índice.

  • A partir de la información de descripción "a, b" de la columna stat_description de la fila de datos PRIMARY con index_name, podemos ver que la columna de información estadística del índice de clave primaria es en realidad igual al número de columnas de índice definidas.

  • De la información de descripción "e, f" de la columna stat_description donde index_name es la fila de datos de i2uniq, podemos ver que la columna de información estadística del índice único es en realidad igual al número de columnas de índice definidas.

  • De la información de descripción "c, d, a, b" de la columna stat_description del index_name de la fila de datos i1, podemos ver que la columna de información estadística del índice ordinario (índice auxiliar no único) es en realidad adicional a la columna de índice definida , También contiene la columna de la clave principal. Es decir, para la información estadística registrada por el índice no único en la tabla, InnoDB agregará la columna de clave primaria.

  • Nota: La página de muestreo de estadísticas persistentes definida por la variable de sistema innodb_stats_persistent_sample_pages en MySQL 5.7 es 20. El valor de la columna sample_size en el ejemplo aquí es 1 porque la cantidad de datos en la tabla es demasiado pequeña y es suficiente para almacenar en una página, por lo que el muestreo real es solo Se utiliza 1 página, si la cantidad de datos es lo suficientemente grande, el valor que se muestra aquí será el valor especificado por la variable de sistema innodb_stats_persistent_sample_pages.

PD: Podemos usar el número de páginas de información del índice en la tabla combinado con el valor de la variable de sistema innodb_page_size para calcular el tamaño de los datos del índice, de la siguiente manera

root@localhost : mysql 08:31:14> SELECT SUM(stat_value) pages, index_name, 
SUM(stat_value)*@@innodb_page_size size FROM mysql.innodb_index_stats WHERE 
table_name='dept_emp' AND stat_name = 'size' GROUP BY index_name;                         
+-------+------------+----------+
| pages | index_name | size |
+-------+------------+----------+
| 737 | PRIMARY | 12075008 |
| 353 | dept_no | 5783552 |
| 353 | emp_no | 5783552 |
+-------+------------+----------+
3 rows in set (0.01 sec) 

El contenido de este número se presenta aquí, y el enlace de referencia para el contenido de este número es el siguiente:

https://dev.mysql.com/doc/refman/5.7/en/innodb-persistent-stats.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-persistent-stats.html

"

"¡Escalando esta montaña, puedes ver un trozo de mar!". Siga leyendo nuestra serie de artículos "Comprensión completa de la biblioteca del sistema MySQL" para compartir, y podrá aprenderlos sistemáticamente. Gracias por leer, ¡nos vemos en el próximo número!

"

| Sobre el autor

Luo Xiaobo · Experto en tecnología de base de datos ScaleFlux

Uno de los autores de "A Thousand Golden Recipes-MySQL Performance Optimization Pyramid Rule", "Data Ecology: MySQL Replication Technology and Production Practice".

Familiarizado con la arquitectura MySQL, bueno en el ajuste general de bases de datos, me gusta especializarse en tecnología de código abierto y interesado en la promoción de la tecnología de código abierto, ha compartido muchos temas de bases de datos públicas en línea y fuera de línea, y ha publicado casi 100 artículos de investigación relacionados con bases de datos.

Se acabó el texto completo.

Disfruta MySQL :)

La clase "MySQL Core Optimization" de Teacher Ye se ha actualizado a MySQL 8.0, escanee el código para comenzar el viaje de la práctica de MySQL 8.0

Supongo que te gusta

Origin blog.csdn.net/n88Lpo/article/details/110507419
Recomendado
Clasificación