InnoDB中dict_update_statistics调用策略及问题

背景

         为了提供优化器支持,InnoDB维护了每个表的索引统计信息(index statistics)。在之前的一篇文章中作过介绍。

         文章里面介绍到索引统计信息有几个更新策略,并建议允许关闭动态更新。顺便提及,5.6已经提供了Persistent Statistics 选项,达到相同的目的。

         在5.5版本还是必须动态更新。本文介绍在动态更新时的一个问题。

 

索引统计的动态更新策略

         这个策略是比较简单的。每个表维护一个stat_modified_counter,每次增、删、改一行时加1,当counter满足一下两个条件之一时,则进行依次动态统计,之后清0 (5.5.29)

1)             1) counter > 2000000000

2)             2) counter > 16 + table->stat_n_rows / 16

table->stat_n_rows表的总行数目(估计值)

 

row_update_statistics_if_needed(

/*============================*/

        dict_table_t*   table)  /*!< in: table */

{

        ulint   counter;

 

        counter = table->stat_modified_counter;

        table->stat_modified_counter = counter + 1;

 

        if (counter > 2000000000

            || ((ib_int64_t)counter > 16 + table->stat_n_rows / 16)) {

 

                dict_update_statistics(table, FALSE /* update even if stats

                                                    are initialized */);

        }   

 

执行索引统计的函数是dict_update_statistics,在执行统计期间,对stat加一个x锁。

 

存在问题

由于这个值不要求精确,因此在counter更新时并未加锁。这个问题并不大,但是未加锁导致另外一个问题:短时间内多次调用dict_update_statistics。

         stat_modified_counter清0是在dict_update_statistics中调用的,但若有多个线程同时判断后进入dict_update_statistics,则会导致多次调用。

         在一个测试场景我们从现场看到同一个时刻用11个用户线程调用dict_update_statistics。这意味着至少多调用了10次索引统计。而索引统计的方法是通过从表中取样本估算的,如果表数据较多,这个索引统计的浪费就很明显了。对查询和更新性能都会有影响。

 

简单修改

         dict_update_statistics的逻辑流程是

1)             1) 加x锁

2)             2) 索引统计

3)             3) stat_modified_counter 置0

4)             4) 解锁

 

简单修改可以在加x锁之后再次判断stat_modified_counter是否需要进行索引统计,若不需要则解锁返回即可。

5.6已经提供了Persistent Statistics 选项,但若关闭,也会有这个问题。

 

构建生产级数据库AI Agent:从安全架构到实战诊断 在实际数据库运维工作中,凌晨三点被告警叫醒,面对CPU 100%、业务大面积超时的紧急情况,DBA需要快速登录控制台、抓取Top SQL、分析锁等待、协调业务方,往往半小时才能定位到根因。随着数据库技术栈从单一关系型扩展到NoSQL、云原生、分布式、多模态,系统复杂度呈指数级增长,而资深DBA的培养周期长、人力成本高,传统“堆人、堆工具、堆SOP(标准作业程序)”的模式已难以为继。此时,AI Agent的出现,为解决这一“剪刀差”问题提供了新的可能性——它不仅仅是自动化脚本的升级,而是旨在将顶尖DBA的经验 阅读详情

相关推荐

AI数据栈三支柱:RDBMS+图数据库+HTAP协同架构

在AI工程落地中,数据基础设施正从单点优化转向多维协同。关系型数据库(RDBMS)作为结构化事实的权威源,保障ACID一致性与向量化扩展能力;图数据库突破SQL JOIN瓶颈,支撑多跳关系遍历与语义推理;HTAP则弥合事务与分析鸿沟,实现毫秒级实时特征供给。三者并非替代关系,而是构成‘稳—深—快’的能力三角:RDBMS锚定数据血缘与业务主键,图数据库建模动态关系网络,HTAP驱动在线决策闭环。该架构已广泛应用于智能推荐、金融风控与工业预测等强实时、高关联AI场景,成为支撑大模型应用落地的关键数据底座。

weixin_34081595的博客 372

数据库 Update Statistics作用及用法

<br />一、Update Statistics的作用<br />   为了提高数据库的效率,INFORMIX提供了一个基于成本的查询优化器, 执行update statistics语句的作用就是将您创建的数据库表的有关统计信息更新到系统sysmaster的相关表中(如systables、 syscolumns、sysindexes、sysdistrib、sysprocplan等),以便查询优化器选择最佳的执行路径。当 sysmaster库中没有相应的统计信息,或者统计信息不十分准确时,优化

yujingyang的专栏 3316

【信息科学与工程学】计算机科学与自动化——第一百五十五篇 缓存系统设计01 基础知识

CPU:拥有 L1/L2/L3 多级缓存,用于暂存即将执行的指令和频繁访问的数据。GPU:包含显存、纹理缓存、常量缓存、指令缓存等,加速图形渲染和通用计算。RAID 卡 / 存储控制器:自带缓存(通常带电池保护),用于合并写操作、加速读写。打印机:内置内存缓存,用于暂存待打印的页面数据,避免反复从电脑传输。光驱 / 蓝光播放器:内部缓存用于平滑读取光盘数据,防止因寻道延迟导致卡顿。操作系统:页缓存(Page Cache):缓存文件系统数据,减少磁盘 I/O。目录缓存(dentry cache):加速路径查找

weixin_49199313的博客 290

mysql索引抽密度_使用索引和统计特性来提高数据库的查询性能(转)

作者: TechRepublic.comFriday, March 5 2004 9:51 AM特别说明:在微软的SQL服务器系统中,对数据库查询功能进行适当的优化需要懂得一些基本的查询索引和性能统计方面的知识。熟悉该系统的优化工作是如何实现的将有助于提高决策的正确性。随着你对微软的SQL服务器数据库实现的逐渐熟悉,性能优化的需求也将进一步增加。建立一个真正实现最优查询功能的数据库环境的第一步是要...

weixin_33245735的博客 272

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

从GAN生成失败案例出发:为什么你的AI画不准位置?CoordConv保姆级解决方案

本文深入探讨了GAN生成图像时位置偏移问题的根源,并提供了CoordConv的保姆级解决方案。通过分析传统CNN在空间坐标建模上的缺陷,详细介绍了CoordConv的原理、实现步骤及在StyleGAN2等模型中的实战应用,显著提升了医学图像生成等任务的定位精度。

pp12345的博客 205

mysql 信息收集_Mysql 收集统计信息

如何收集统计信息Analyze table收集表和索引统计信息,适用于MyISAM和InnoDB;对于innodb表,还可以使用以下选项1 表第一次打开的时候2 表修改的行超过1/16或者20亿条./row/row0mysql.c:row_update_statistics_if_needed3 执行show index/table或者查询information_schema.tables/sta...

weixin_29169899的博客 414

SpringBoot文件上传实战:MultipartFile重复读取的3种方法(附避坑指南)

本文详细介绍了SpringBoot中处理MultipartFile重复读取的3种实用方法,包括字节数组缓存法、临时文件法和流重置法,并提供了避坑指南和性能优化技巧。特别适合需要多次读取上传文件内容的开发者,帮助解决InputStream流只能读取一次的问题。

weixin_28710999的博客 398

MySQL中STATISTICS表详解

MySQL自带库information_schema中的表STATISTICS存放是索引的信息,表字段及解释如下: 字段 说明 TABLE_CATALOG 包含索引的表所属的目录的名称。 该值始终为def TABLE_SCHEMA 包含索引的表所属的结构(数据库)的名称 TABLE_NAME ...

YL的专栏 8139

树莓派教程(基于python编程)--入门篇

一:格式化SD卡 SD卡插入读卡器连接电脑,使用SDFormatter对SD卡进行格式化 (重装烧录也要进行着SD卡格式化操作) 二:下载官方镜像 http://downloads.raspberrypi.org/raspbian_latest 三:烧录SD卡 使用Win32DiskImager将镜像烧录到格式化后的SD卡 SD卡盘根目录(/boot)下新建一个命名为ssh的...

qq_42109746的博客 6万+

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3129

A new parameter to control updating statistics strategy

       If a table contains several indexes and a select query does not have a “force index” hint clause, the MySQL optimizer take charge of determining which index to use. In some cases, we find tha...

追风刀·丁奇 248

DataGridView 右键菜单复制(公共)

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {

沁心渃水 2833

MediaCrawler:多平台媒体数据采集的工程化爬虫框架深度解析

网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向目标服务器发送HTTP请求,并解析返回的HTML或JSON数据以提取结构化信息。这项技术的价值在于能够高效、批量化地获取公开网络数据,为市场分析、学术研究和竞品监控等场景提供数据基础。在实际工程应用中,一个健壮的爬虫系统需要解决反爬机制对抗、数据持久化、任务调度和可维护性等挑战。MediaCrawler正是这样一个面向抖音、小红书、B站等多平台的工程化爬虫框架,它采用模块化设计,将调度器、下载器、解析器和数据管道等组件解耦,显著提升了代码的可

weixin_30388677的博客 563

56、CAN总线RC低通滤波器截止频率计算与实战

本文详细探讨了CAN总线RC低通滤波器的设计与应用。作者通过实际项目案例,分析了CAN总线噪声频谱特性,提出截止频率计算的"黄金法则",强调需考虑收发器输入阻抗的并联效应。文章给出RC参数选择的经验值(R=100Ω-1kΩ,C=10pF-100pF),并指出PCB布局的关键要点:RC应紧贴收发器引脚,电容接地端需直接连接地平面。最后建议结合示波器和眼图验证效果,并提醒RC滤波器只是抗干扰方案的一部分,良好的PCB布局设计才是根本。

2401_88858637的博客 71

【PX4学习笔记】1. ROS及PX4环境搭建

环境 Ubuntu18.04 安装教程参考 https://www.guyuehome.com/8983 安装过程中问题的解决 问题1 rosdep init 错误的终极解决方法 注意etc/下的ros和rostep文件夹要自己建 问题2 Ubuntu安装ROS报错 sudo: rosdep:找不到命令 问题3(更好地解决了问题1、2)【推荐】 解决GitHub的raw.githubusercontent.com无法连接问题 问题4:GeographicLib的安装 教程中安装GeographicLib d

【人工智障 | 计算鸡视觉 | 机器孩】 8234

flyway实战技巧(一个可以控制数据库像git一样管理的神奇工具!!)

flyway在实际项目中的使用经验及踩坑点

qq_61992752的博客 383

大模型长对话中上下文无法承载全部历史,如何压缩或提取重点

如果说截断和滑动窗口是“硬性”压缩,那摘要生成技术就显得“软”多了,也更接近于智能化的解决方案。它的思路是:不直接丢弃历史,而是通过自然语言处理(NLP)技术,把冗长的对话记录浓缩成一段简短的摘要,保留核心信息。这样既能大幅减少token数量,又不至于丢失关键内容。这种方法通常会借助预训练模型,比如BART或T5,它们擅长从长文本中提取重点内容。

大模型大数据攻城狮的专栏 1591

SQL Server重建索引与重组索引会更新统计信息吗?

在SQL Server中重建索引(Rebuild Index)与重组索引(Reorganize Index)会触发统计信息更新吗? 那么我们先来测试、验证一下: 我们以AdventureWorks2014为测试环境,如下所示: Person.Person表的统计信息最后一次更新为2014-07-17 16:11:31,如下截图所示: DECLARE @table_name NVARCHAR(32);SET @table_name='Person.Person'SELECT sch....

whyrookie的博客 799

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

UPDATE STATISTICS

该命令在一张表或者索引了的视图上更新查询优化统计数字信息. 默认情况下, 查询优化器已经更新了必要的用来提高查询计划的统计信息; 在某些情况下, 你可以通过使用UPDATE STATISTICS 命令或者存储过程sp_updatestats 来比默认更频繁地更新统计信息来提高查询效率.   更新统计信息能确保查询能以最新的统计信息来编译. 然而, 更新统计信息会引起查询的重新编译. 我们建议不要...

weixin_34320159的博客 643

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Update Statistics用法

     一、Update Statistics的作用  为了提高数据库的效率,INFORMIX提供了一个基于成本的查询优化器,执行update statistics语句的作用就是将您创建的数据库表的有关统计信息更新到系统sysmaster的相关表中(如systables、syscolumns、sysindexes、sysdistrib、sysprocplan等),以便查询优化器选择最佳的执行路径

杂记 2万+

Mysql 5.7中数据量更改统计数据收集的逻辑

今天一个朋友在问Mysql数据修改后什么时候收集统计数据,我就简单的找了一下源代码,现总结如下。如有错误请指出,因为我只是简单做了一下调试。 一、持久化(PERSISTENT))与非持久化统计数据(T...

cri5768的博客 399
上一篇: [MySQL 版本差异] 丢失frm文件之后drop database的不同结果分析
下一篇: InnoDB中Adaptive hash index存在问题、Percona改进及一个bug
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值