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_SCHEMA
inserta 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.TABLES
si AUTO_INCREMENT
se 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_expiry
controlado 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_stats
y mysql.table_stats
en 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_stats
y . mysql.table_stats
Las 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_stats
y mysql.table_stats
la tabla no actualizarán automáticamente las estadísticas almacenadas en caché.
Parámetros básicos
Parámetros básicos information_schema_stats_expiry
El valor predeterminado es 86400 segundos. Es decir, la información estadística relevante se recopila automáticamente cada dos días en information_schema
los 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_expiry
determina 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_stats
tablas de diccionario en los siguientes casos:mysql.table_stats
- Cuando las estadísticas almacenadas en caché aún no han caducado.
- Cuando
information_schema_stas_expiry
se establece en 0. innodb_read_only
Cuando el servidor MySQL está en modo de solo lectura, súper solo lectura, solo lectura transaccional o .- Al consultar también obtiene
Performance Schema
datos de .
information_schema_stas_experity
Se 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.tables
en , 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.tables
el 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_expiry
a 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 |