新特性解读 | MySQL 8.0 字段信息统计机制
作者通过一个案例详细说明了 MySQL 8.0 字段信息统计机制的相关参数和使用方式。
作者:杨奇龙
网名“北在南方”,资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。
本文来源:原创投稿
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
背景
前几天有同事在咨询一个问题:某个业务基于 INFORMATION_SCHEMA 统计表的信息(比如最大值)向表里面插入数据。
请问 INFORMATION_SCHEMA.TABLES 中的 AUTO_INCREMENT 会不会及时的更新呢?
先说结论:可以!
这里涉及到 信息统计机制 或者说频率问题,主要由参数
information_schema_stats_expiry控制。
表信息更新的基本逻辑
默认情况下,MySQL 会高效的从 系统表 mysql.index_stats 和 mysql.table_stats 中检索这些列的缓存值,而不是直接从存储引擎中获取统计信息。如果缓存的统计信息不可用或已过期,MySQL 将从存储引擎中检索最新的统计信息,并将其统计信息更新并缓存在 mysql.index_stats 和 mysql.table_stats 字典表中。后续查询将检索缓存的统计信息,直到缓存的统计数据过期。
值得注意的是:MySQL 重新启动或第一次打开 mysql.index_stats 和 mysql.table_stats 表不会自动更新缓存的统计信息。
核心参数
核心参数 information_schema_stats_expiry 默认是 86400 秒。也就是说每隔一天自动收集一次相关统计信息到 information_schema 中的如下表字段中:
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
参数 information_schema_stats_expiry 的值决定再次收集表的统计信息的时间间隔,默认 86400 秒。如果设置为 0 ,则表示实时更新统计信息,当然势必会影响一部分性能。
在以下情况中,查询统计信息列不会在 mysql.index_stats 和 mysql.table_stats 字典表中存储或更新统计信息:
- 缓存的统计信息尚未过期时。
- 当
information_schema_stas_expiry设置为 0 时。 - 当 MySQL server 处于只读、超级只读、事务只读或
innodb_read_only模式时。 - 查询还获取
Performance Schema的数据时。
information_schema_stas_experity 支持全局和会话级别,每个会话都可以定义自己的过期值。从存储引擎中检索并由一个会话缓存的统计信息可用于其他会话。
测试
本文以 MySQL 8.0.30 为例,进行分析。
2.1 测试准备
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 测试
查看 information_schema.tables 中 sbtest1 的当前信息,最大值 1200006,表结构定义中自增最大值也是 1200006。
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)
插入新的数据,自增值加 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)
但是 information_schema.tables 中的值并未发生变化。
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)
设置为实时更新
修改information_schema_stats_expiry 为 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)
插入数据自增加 1 ,查询 information_schema.tables 中的 自增列统计值 也是实时更新。
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)
手工修改自增列,也是可以实时更新。
master [localhost:22031] {msandbox} (test) > alter table sbtest1 AUTO_INCREMENT=1200010;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0master [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)
小结
MySQL 8.0 对于表字段的统计信息提供更多的技术特性来支持。统计有效性时长,字段本身的直方图,使用起来越来越便利。
回过头来看这个需求,其实如果是业务监控或者数据库监控信息比如监控表的主键最大值是否溢出,比较实际的建议还是查询具体的表的最大 id 值,比较实际,查询频率看可控。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取
| 类型 | 地址 |
|---|---|
| 版本库 | https://github.com/actiontech/sqle |
| 文档 | https://actiontech.github.io/sqle-docs/ |
| 发布信息 | https://github.com/actiontech/sqle/releases |
| 数据审核插件开发文档 | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |
相关文章:
新特性解读 | MySQL 8.0 字段信息统计机制
作者通过一个案例详细说明了 MySQL 8.0 字段信息统计机制的相关参数和使用方式。 作者:杨奇龙 网名“北在南方”,资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 本文来源:原创投…...
基于Java+Swing实现超级玛丽游戏
基于JavaSwing实现超级玛丽游戏 一、系统介绍二、功能展示三、其他系统 一、系统介绍 超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断…...
Day12-1-Webpack前端工程化开发
Webpack前端工程化 1 案例-webpack打包js文件 1 在index.html中编写代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…...
JUnit教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。JUnit是由 Erich Gamma 和…...
Hive 安装介绍
介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储,说白了hive可以理解为一个将SQL转换为Ma…...
npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法
npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法 1、问题描述2、解决方法 1、问题描述 由于之前电脑系统的原因,电脑重置了一下,之前安装的环境都没了,然后在重新安装node.js后在使用npm安装时总是报如下错误:…...
redis 高级篇4 分布式锁
一 redis架构图 1.1 redis的架构图 1.2 分布式锁满足条件 1.独占性;2.高可用;3.防死锁;4.不乱抢;5.重入性 二 分布式锁的案例情况 2.1 分布式锁1:单机分布式部署 描述: 使用lock锁和synchronized,单机…...
TPU-NNTC 编译部署LPRNet 车牌识别算法
TPU-NNTC 编译部署LPRNet 车牌识别算法 注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,以下步骤将在基于x86架构CPU的开发环境中完成 初始化开发环境(基于x86架构CPU的开发环境中完成)模型转换 (基于x86架构CPU的开发环境中完成) 处理后的LPRNet 项…...
在线/开源GNSS处理软件/平台介绍
当前,存在较多的GNSS开源/免费软件,可用于质量检核、RTK解算和PPP解算等,本文总结了部分常用的处理软件,其详细信息如表1和表2所示。 表1 常用GNSS预处理(格式转换、质量检核)软件: 软件名称 …...
SpringBoot集成企业微信群聊机器人消息
目录 参考文档概述一、功能作用二、应用场景三、 群机器人发送限制四、创建机器人1、添加2、群机器人Webhook地址 五、发送消息1、文本 text请求体 图文连接 news 参考文档 官方文档 企业微信群机器人应用 概述 现在很多企业都在使用企业微信进行工作交流,自从企…...
五、驱动 - 音频系统硬件电路
文章目录 1. 音频系统硬件电路结构2. 蓝牙音频2.1 音乐播放2.2 VoIP通话2.3 4G通话3. 其他3.1 什么是S/PDIF1. 音频系统硬件电路结构 录音放音设备:mic、speaker、耳机、听筒这些带有录音放音功能的设备(因为录放设备可能是模拟设备也可能是数字设备,所以接口可能是模拟接口…...
【图像分割和识别】活动形状模型 (ASM) 和活动外观模型 (AAM)(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
HTML基础介绍2
表单格式化 ctrld:复制选中行数的所有代码 ctrlx:删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…...
rar压缩包怎么改成zip格式
不知道大家有没有遇到需要转换压缩包格式的问题,今天想和大家分享rar压缩包改成zip格式的方法。 方法一: 直接修改rar压缩包的后缀名变为zip,就可以修改压缩包文件格式了 方法二: 先将rar压缩包解压出来,然后再将解…...
Mac 补丁管理
Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们,最后将它们推广到生产环境中进行部署来管理 macOS 端点,修补 Mac 设备(又称 Mac 修补)可增强 macOS 环境的安全级别。 什么是 m…...
【物理】带电粒子在磁场和电场中移动的 3D 轨迹研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【云原生】K8S二进制搭建上篇
目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…...
day49-Springboot
Springboot 1. Springboot简介 1.1 简介:Springboot来简化Spring应用开发的一个框架,约定大于配置 1.2 优点: 可以快速的构建独立运行的Spring项目; 框架内有Servlet容器,无需依赖外部,所以不需要达成w…...
Day 9 字符串
慢慢补。 Prefixes and Suffixes 水个代码先。 代码...
Promise用法
学习了promise之后,有点懂但让我说又说不出来,参考别人的记录一下。 1.什么是promise? 2.promise解决了什么问题 3.es6 promise语法 (1)then链式操作语法 (2)catch的语法 (3…...
CMake 导言
为什么选择 CMake 在掌握 Linux 基础后,我们知道一个项目通常由多个源文件组成。想要构建这个项目,就需要按照一定的规则对源文件进行编译和链接,而这些规则通常需要在 Makefile 中定义。 但随着项目体量增大,手写 Makefile 会变得…...
寒冬降临:当资本撤出AI测试赛道
2026年初,全球资本市场对AI技术的狂热投资骤然降温。随着VC基金转向更保守的资产配置,依赖融资的AI测试工具开发商面临生存危机:初创公司批量裁员,开源项目停止维护,企业采购的智能测试平台因无法续约沦为“断线木偶”…...
OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单
OpCore-Simplify:一键自动化黑苹果配置,让复杂技术变得简单 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是…...
Qwen3.5-9B生产环境实测:7x24小时稳定运行+自动恢复+错误率<0.3%运维报告
Qwen3.5-9B生产环境实测:7x24小时稳定运行自动恢复错误率<0.3%运维报告 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在实际生产环境中展现出卓越的稳定性和可靠性。经过长达一个月的7x24小时不间断运行测试,该系统实现了…...
Modbus协议详解:从原理到工业应用实践
1. Modbus协议概述Modbus是一种应用层报文传输协议,由Modicon公司(现为施耐德电气旗下品牌)于1979年开发。作为工业自动化领域最广泛采用的通信协议之一,它定义了控制器设备之间交换信息的通用语言。关键特性:协议标准…...
Vue2项目构建优化实战:时间戳防缓存与资源压缩的配置详解
1. 为什么Vue2项目需要构建优化 最近接手了一个老项目的维护工作,发现每次前端更新后总有用户反馈页面显示异常。排查后发现是浏览器缓存惹的祸——用户访问的仍然是旧版本的静态资源。这让我意识到构建优化的重要性,特别是对于需要频繁更新的业务系统。…...
导入MotorCAD API(需先安装MotorCAD的Python接口)
基于Motorcad的4极6槽 内转子采用内插式磁钢 3000rpm 输出转矩 2.6Nm 效率93%外径 94mm 轴向长度70mm 功率800w 直流母线380V 永磁同步电机(永磁直流无刷)模型(PMSM或者是BLDC) 最近捣鼓了个小功率PMSM模型,用MotorCAD搭了个4极6槽内插式的&a…...
效率提升:基于快马平台为dc=y103pc=类参数快速打造调试工具
效率提升:基于快马平台为dcy103&pc类参数快速打造调试工具 在日常开发中,我们经常需要处理各种URL参数,尤其是类似"dcy103&pctest"这样的查询字符串。手动解析和修改这些参数不仅效率低下,还容易出错。最近我在…...
Odoo 19成本核算避坑指南:标准成本法下差异分析、委外加工汇率风险与WIP分录丢失问题
Odoo 19成本核算实战避坑指南:标准成本差异、委外加工与WIP分录的深度解决方案 在制造业数字化转型浪潮中,Odoo 19作为开源ERP的领军者,其制造与会计模块的深度集成能力备受企业青睐。然而,当我们真正将系统投入生产环境时&#x…...
StructBERT文本相似度模型Java开发实战:SpringBoot集成与API调用
StructBERT文本相似度模型Java开发实战:SpringBoot集成与API调用 你是不是也遇到过这样的场景?用户搜索“苹果手机”,你希望系统不仅能返回iPhone,还能识别出“苹果公司手机”、“Apple iPhone”这些同义查询。或者,在…...
