Interpretación de nuevas características | Mecanismo de estadísticas de información de campo de MySQL 8.0

A través de un caso, el autor explica en detalle los parámetros relevantes y el uso del mecanismo de estadísticas de información de campo de MySQL 8.0.

Autor: Yang Qilong

Net name "North in the South", DBA senior, principalmente responsable del diseño de la arquitectura de la base de datos y el desarrollo de la plataforma de operación y mantenimiento, bueno en el ajuste del rendimiento de la base de datos y el diagnóstico de fallas.

Fuente de este artículo: contribución original

Producido por la comunidad de código abierto de Aikesheng, no se permite usar el contenido original sin autorización, comuníquese con el editor e indique la fuente para la reimpresión.

fondo

Hace unos días, un colega estaba haciendo una pregunta: cierta empresa INFORMATION_SCHEMAinserta datos en la tabla en función de la información (como el valor máximo) de la tabla estadística.

¿ Puedo preguntar INFORMATION_SCHEMA.TABLESsi AUTO_INCREMENTse actualizará a tiempo?

Permítanme hablar sobre la conclusión primero: ¡ sí!

Esto involucra el mecanismo de estadísticas de información o el problema de la frecuencia, el cual es information_schema_stats_expirycontrolado principalmente por parámetros.

Lógica básica de actualización de la información de la tabla

Por defecto, MySQL recuperará eficientemente los valores almacenados en caché de estas columnas de las tablas del sistema mysql.index_statsy mysql.table_statsen lugar de obtener estadísticas directamente del motor de almacenamiento. Si las estadísticas almacenadas en caché no están disponibles o han caducado, MySQL recupera las estadísticas más recientes del motor de almacenamiento y actualiza y almacena en caché sus estadísticas en las tablas de diccionario mysql.index_statsy . mysql.table_statsLas consultas posteriores recuperarán las estadísticas almacenadas en caché hasta que caduquen.

Vale la pena señalar que: el reinicio o la apertura de MySQL por primera vez mysql.index_statsy mysql.table_statsla tabla no actualizarán automáticamente las estadísticas almacenadas en caché.

Parámetros básicos

Parámetros básicos information_schema_stats_expiryEl valor predeterminado es 86400 segundos. Es decir, la información estadística relevante se recopila automáticamente cada dos días en information_schemalos siguientes campos de la tabla en:

STATISTICS.CARDINALITY
TABLES.AUTO_INCREMENT
TABLES.AVG_ROW_LENGTH
TABLES.CHECKSUM
TABLES.CHECK_TIME
TABLES.CREATE_TIME
TABLES.DATA_FREE
TABLES.DATA_LENGTH
TABLES.INDEX_LENGTH
TABLES.MAX_DATA_LENGTH
TABLES.TABLE_ROWS
TABLES.UPDATE_TIME

El valor del parámetro information_schema_stats_expirydetermina el intervalo de tiempo para recopilar estadísticas de la tabla nuevamente y el valor predeterminado es 86400 segundos. Si se establece en 0, significa que la información de las estadísticas se actualizará en tiempo real , lo que definitivamente afectará un poco el rendimiento.

La consulta de columnas de estadísticas no almacena ni actualiza estadísticas en mysql.index_statstablas de diccionario en los siguientes casos:mysql.table_stats

  1. Cuando las estadísticas almacenadas en caché aún no han caducado.
  2. Cuando information_schema_stas_expiryse establece en 0.
  3. innodb_read_onlyCuando el servidor MySQL está en modo de solo lectura, súper solo lectura, solo lectura transaccional o .
  4. Al consultar también obtiene Performance Schemadatos de .

information_schema_stas_experitySe admiten los niveles global y de sesión, y cada sesión puede definir su propio valor de caducidad. Las estadísticas recuperadas del motor de almacenamiento y almacenadas en caché por una sesión están disponibles para otras sesiones.

prueba

Este artículo toma MySQL 8.0.30 como ejemplo de análisis.

2.1 Preparación de la prueba

  CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB ;

2.2 Pruebas

Vea la información actual information_schema.tablesen , el valor máximo es 1200006 y el valor máximo de autoincremento en la definición de la estructura de la tabla también es 1200006.sbtest1

master [localhost:22031] {msandbox} (test) > show variables like 'information_schema_stats_expiry' ;
+-----------------------------------------+---------+
| Variable_name                   | Value |
+-----------------------------------------+---------+
| information_schema_stats_expiry | 86400 |
+-----------------------------------------+---------+
1 row in set (0.02 sec)

master [localhost:22031] {msandbox} (test) > select  table_name, AUTO_INCREMENT  from information_schema.tables where  table_name='sbtest1';
+---------------+--------------------+
| TABLE_NAME | AUTO_INCREMENT |
+---------------+--------------------+
| sbtest1    |        1200006 |
+---------------+--------------------+
1 row in set (0.01 sec)

master [localhost:22031] {msandbox} (test) > show create table  sbtest1 \G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1200006 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

Insertar nuevos datos, incrementar en 1.

master [localhost:22031] {msandbox} (test) > insert into sbtest1(k,c,pad) values(1,'c','cc');
Query OK, 1 row affected (0.00 sec)

master [localhost:22031] {msandbox} (test) > show create table  sbtest1 \G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1200007 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

Pero information_schema.tablesel valor en no cambió.

master [localhost:22031] {msandbox} (test) > select  table_name, AUTO_INCREMENT  from information_schema.tables where  table_name='sbtest1';
+------------+----------------+
| TABLE_NAME | AUTO_INCREMENT |
+------------+----------------+
| sbtest1    |        1200006 |
+------------+----------------+
1 row in set (0.00 sec)

Configurar para actualizar en tiempo real

Modificar information_schema_stats_expirya 0.

master [localhost:22031] {msandbox} (test) > set  information_schema_stats_expiry=0;
Query OK, 0 rows affected (0.00 sec)

master [localhost:22031] {msandbox} (test) > show variables like 'information_schema_stats_expiry' ;
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| information_schema_stats_expiry | 0     |
+---------------------------------+-------+
1 row in set (0.00 sec)

master [localhost:22031] {msandbox} (test) > select  table_name, AUTO_INCREMENT  from information_schema.tables where  table_name='sbtest1';
+------------+----------------+
| TABLE_NAME | AUTO_INCREMENT |
+------------+----------------+
| sbtest1    |        1200007 |
+------------+----------------+
1 row in set (0.00 sec)

master [localhost:22031] {msandbox} (test) > show create table  sbtest1 \G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1200007 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

Los datos insertados aumentan automáticamente en 1, y el valor estadístico de la columna de autoincrementoinformation_schema.tables en la consulta también se actualiza en tiempo real.

master [localhost:22031] {msandbox} (test) > insert into sbtest1(k,c,pad) values(1,'c','cc');
Query OK, 1 row affected (0.00 sec)

master [localhost:22031] {msandbox} (test) > select  table_name, AUTO_INCREMENT  from information_schema.tables where  table_name='sbtest1';
+------------+----------------+
| TABLE_NAME | AUTO_INCREMENT |
+------------+----------------+
| sbtest1    |        1200008 |
+------------+----------------+
1 row in set (0.00 sec)

master [localhost:22031] {msandbox} (test) > show create table  sbtest1 \G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1200008 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

La modificación manual de la columna de incremento automático también se puede actualizar en tiempo real.

master [localhost:22031] {msandbox} (test) > alter table sbtest1  AUTO_INCREMENT=1200010;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

master [localhost:22031] {msandbox} (test) > select  table_name, AUTO_INCREMENT  from information_schema.tables where  table_name='sbtest1';
+------------+----------------+
| TABLE_NAME | AUTO_INCREMENT |
+------------+----------------+
| sbtest1    |        1200010 |
+------------+----------------+
1 row in set (0.00 sec)

resumen

MySQL 8.0 proporciona más funciones técnicas para admitir la información estadística de los campos de la tabla. La duración de la validez estadística y el histograma del propio campo son cada vez más cómodos de usar.

Mirando hacia atrás en este requisito, de hecho, si se trata de información de monitoreo de negocios o de base de datos, como si se desborda el valor máximo de la clave principal de la tabla de monitoreo, la sugerencia más práctica es consultar el valor máximo de la tabla específica. práctico, la frecuencia de consulta es controlable id.

Para obtener más artículos técnicos, visite: https://opensource.actionsky.com/

Acerca de SQLE

El SQLE de la comunidad de código abierto de Akson es una herramienta de auditoría de SQL para usuarios y administradores de bases de datos, que admite la auditoría de escenarios múltiples, admite procesos en línea estandarizados, admite de forma nativa la auditoría de MySQL y tiene tipos de bases de datos escalables.

SQLE obtener

tipo DIRECCIÓN
Repositorio https://github.com/actiontech/sqle
documento https://actiontech.github.io/sqle-docs/
lanzamiento de noticias https://github.com/actiontech/sqle/releases
Documentación de desarrollo del complemento de auditoría de datos https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

Supongo que te gusta

Origin blog.csdn.net/ActionTech/article/details/132062354
Recomendado
Clasificación