深入聊聊MySQL直方图的应用

MySQL直方图:解决统计信息不准的性能优化神器 直方图是MySQL 8.0+针对非均匀分布数据查询的“核武器”,能以极低成本实现rows预估精准化,让执行计划更优,进而大幅提升查询性能。下一步行动建议从慢查询日志中挖掘高频过滤列,确定直方图优化对象;用EXPLAIN对比优化前后的执行计划,验证优化效果;优先对核心业务表部署直方图,逐步推广至全量表。建议挑选一张业务表,复制文中SQL实操尝试,感受优化前后的性能差异!你的关注是我输出干货的最大动力,下篇将分享索引黑科技,一起突破MySQL性能瓶颈! 阅读详情
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:JennyYu

本文是在假定读者了解了直方图是什么,直方图如何进行添加维护的前提下,围绕直方图与索引的对比、何时应该添加直方图,及直方图如何帮助优化器选择更优的执行计划这几个方面来介绍直方图。
对直方图不太了解的小伙伴可参考GreatSQL社区的另一篇文章 4.直方图介绍和使用|MySQL索引学习

直方图的作用

直方图用于描述数据表中列上的数据分布,这些关于数据分布的内容,可以帮助优化器更准确地估计给定的where子句或联接条件将过滤掉表中多少数据。这里我们要清楚的一点,直方图并不能像索引一样可以帮助减少要访问的行数,它只是帮助优化器选择更合适的执行计划。
MySQL8开始支持直方图,但实际上直方图在MySQL中,不像在其他数据库中那样有用,因为MySQL能够通过index dive,直接访问索引对应的B+树,来计算某个扫描区间内对应的索引记录条数,所以直方图不能与同一列上的索引一起使用,而且优化器优先使用索引。

直方图与索引相比,优点是什么

MySQL的索引既可以有效估算索引范围内的行数,又可以帮助减少要访问的记录,为什么还要引入直方图呢?
与索引相比,直方图的一个好处是,在确定过滤条件返回行数时直方图比索引成本要低,直方图的统计信息可以轻松用于优化器,而索引在确定查询计划时,要执行下潜操作来估算行数,并且每次执行查询时都要重复执行这样的操作。
讲到这里可能大家会有一个疑问,不是有索引统计信息吗,为何每次都要执行下潜操作来估算呢?其实MySQL是这样设计的,有一个参数eq_range_index_dive_limit(默认值200), 对于索引列而言,当存在与此参数设置相等或更大的区间范围过滤条件时,优化器将从下潜转换为只使用索引统计信息来估算匹配行的数量。因为MySQL认为使用index dive估算比统计信息更准确,但是当过滤的区间范围条件多,比如使用in来过滤,条目值达到1000,过滤区间就会有1000个,这样index dive的成本太高,MySQL就倾向于使用索引统计信息了。
似乎跑题了呢,回归正传。
与索引相比,直方图的第二个好处是,索引维护有代价,执行DML操作时需要维护索引,所以索引多了就会影响DML操作的效率,直方图统计信息只需在非业务高峰定期收集即可,对DML操作无影响。
与索引相比,直方图的第三个好处是,索引会增加表空间文件的大小,而直方图统计信息占用的空间可忽略不计。

既无索引又无直方图,优化器如何估算返回行数

如果过滤条件上既没有索引也没有直方图,优化器如何估算过滤比例呢,优化器会根据MySQL代码中内置的默认规则来估计过滤比例,相当于根据自己的想法瞎猜。默认的过滤比例以一个列表形式来展示如下:

过滤类型过滤比例
等值过滤(=)10%
不等于(<>或!=)90%
不等式(< 或>)33.33%
Between11.11%
INMin(条目*10, 50)

举个例子;执行语句:explain select * from t1 where temporary= 'N';对t1表的字段 temporary 进行等值过滤。

图片

从上图可以看出,优化器按规则估算过滤比例,filtered为10%,也就是估算返回行数为rows * filtered/100=7183行,而实际返回行数为72214,filtered=72214/72435=99.69。这个差异可谓很大了。

收集一下该列上直方图的统计信息后,再去查看执行计划中的filtered,此时filtered就相当精确了。

图片

数据分布不均匀时,MySQL以不变应万变的处理规则,估算肯定是相当不准确的,因此在选择执行计划时就有可能做出错误的决策。索引的维护有代价,不能在每个涉及条件的列上都加上索引,那么在不适合创建索引的列上创建直方图,可以作为索引的补充,帮助优化器更好的选择执行计划。

何时应该添加直方图

因为MySQL在sql优化阶段会对索引进行下潜操作来估算返回行数,导致直方图在MySQL中使用空间是有限的,那么究竟要在哪些列上创建直方图,才能有效发挥直方图的作用呢?
创建直方图的最佳候选是符合下列条件的列:

  1. 数据分布不均匀,或者具有太多值,以至于优化器粗略估算无法很好的估计数据的选择行。
  2. 选择性差的列(否则索引可能是更好的选择)
  3. 用于在where子句或联接条件过滤表的数据。如果不对列进行过滤,则优化器无法使用直方图。
  4. 随着时间推移,数据分布逐渐稳定的列。直方图统计信息不会自动更新。如果在数据分布频繁变化的列上添加直方图,则直方图统计信息可能不准确。

直方图应用举例

其实直方图对于单表访问用处不大,主要体现在表联接时,表的联接方式有多种选择时,直方图才可以帮助确定何种选择最好。
举个例子来说明。
a1,a2两个表做关联查询。两个表结构信息如下图所示:

图片

关联查询语句:
select * from a1,a2 where a1.id=a2.id and a1.temporary='N' and a2.status='NOVALID';两表在关联条件的字段上都有索引,又都有额外的过滤条件,优化器在选择走嵌套联接时,有两种可能,一种a1驱动a2,一种是a2驱动a1,哪种方式更好,取决于两表使用过滤条件过滤后哪个表返回的行数少,因为我们知道嵌套联接时,小表驱动大表效率高。而a1表的temporary字段,a2表的status字段数据分布不均匀,选择性差,不适合建立索引。这个时候直方图就有用武之地了。已知a1表的temporary='N’条件过滤性差,a2表的status='NOVALID’的过滤性好,用a2驱动a1效率会更高。因为没有直方图时,优化器不知道谁的过滤性好,按等值过滤的默认规则filtered=10进行过滤,在选择执行计划时就有可能做出错误决策。
我们先看没有收集直方图时的执行计划。如下图所示:

图片

从图中可以看出优化器选择了a1驱动a2, a1表过滤后估算的行数为7049,而实际为72214,a2表作为被驱动表被扫描72214次。执行总耗时280ms。 下面对a2表的status列收集直方图,然后再执行关联查询,如下图所示:

图片

从上图可以看出,有了直方图后,优化器选择了a2驱动a1, a2表过滤后估算的行数为8,实际也为8,a1作为被驱动表只扫描了8次。执行总耗时87ms,效率提升了3倍。

体会到直方图的作用了吗,直方图告诉了优化器数据分布,让优化器估算更准确,进而让优化器做出了英明的决策。


Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

6440

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群。

image-20221030163217640

MySQL 8.0 vs 5.6实战避坑指南:从性能优化到安全配置的全面对比 本文深入对比了MySQL 8.0与5.6在性能、安全及运维方面的核心差异,提供实战避坑指南。重点解析了默认字符集、数据字典、并行查询、降序索引、安全认证插件等关键升级点,并给出从性能优化到安全配置的迁移建议,帮助开发者和DBA平稳升级,充分发挥MySQL 8.0的现代特性优势。 阅读详情

相关推荐

MySQL新版本特性之:`MySQL 8.0`的`直方图`:`Optimizer`如何使用`直方图`来优化查询。

在数据库领域,直方图是对列中数据分布情况的统计摘要。它将列中的值范围划分为若干个桶(buckets),并记录每个桶内值的数量或频率。为什么要使用直方图?传统的统计信息(如最小值、最大值、平均值等)对于 Optimizer 来说,在某些情况下提供的信息不足以做出最佳的查询计划。例如,如果列中的数据分布极不均匀,某些值的出现频率远高于其他值,简单的统计信息就无法准确反映这种偏差。直方图则可以更精细地刻画数据分布,帮助 Optimizer 做出更明智的决策。直方图的类型。

weixin_41455464的博客 590

MySQL8.0新特性学习笔记(三):直方图

目录 一,直方图简介 二,直方图的生成 三,直方图的删除 四,直方图的存储 五,举例说明直方图的作用 六,直方图和索引 七,获得直方图的信息 一,直方图简介 直方图,histogram,直译就是柱状图,国内多翻译为直方图。 直方图不是图,是对表的某个字段数据分布的统计,这种数据统计是基于某字段的实际存储数据分布得出的。 这种分布统计可以帮助查询优化器掌握字段真实的情况,从而得...

lkforce 2186

MySQL 8.0 vs 5.6:从架构到性能的全面升级解析

本文全面解析了MySQL 8.0相较于5.6版本的重大升级,涵盖架构、性能、安全与功能四大维度。MySQL 8.0在默认配置、InnoDB引擎、查询优化器及安全管控上进行了深度优化,性能显著提升,并引入了窗口函数、原子DDL等现代特性。对于新项目,强烈建议直接采用MySQL 8.0;对于现有5.6系统,若面临性能瓶颈或安全合规需求,规划升级将带来长期收益。

weixin_29211309的博客 333

2023-03-09 MySQL源码分析-MySQL中的直方图

直方图的在查询优化中的作用主要是为了优化器中的代价模型提供代价中的统计信息计算, 本文对其进行分析

悟世之路 779

MySQL 8.4 LTS版本模型解析与生产环境升级实战指南

数据库版本管理是软件开发生命周期中的核心环节,它直接关系到系统的稳定性、安全性与可维护性。其基本原理是通过制定清晰的发布和支持策略,平衡快速迭代与长期稳定这对矛盾。在技术价值层面,一套优秀的版本模型能帮助团队降低运维成本、控制技术风险,并平滑规划升级路径。当前,MySQL数据库采用的创新版与长期支持版双轨模型,正是这一理念的工程实践典范。其中,长期支持版为生产环境提供了长达数年的稳定基石,而创新版则作为前沿功能的试验场。本文聚焦于MySQL 8.4 LTS这一关键版本,深入探讨其性能增强、可观测性提升等特性

weixin_28673669的博客 615

MySQL中直方图统计信息的使用

在MySQL中,直方图统计信息是通过收集数据列的值范围及其对应的行数来构建的。直方图提供了关于数据分布的统计信息,使得查询优化器能够更准确地估计查询条件的选择性,并生成更优化的执行计划。当查询中包含涉及到直方图统计信息的条件时,查询优化器将使用这些信息来更准确地估计条件的选择性,并选择更合适的索引或执行计划。通过收集和利用数据分布的统计信息,查询优化器可以更准确地估计查询条件的选择性,并生成更优化的执行计划。的直方图统计信息可用,查询优化器将使用直方图统计信息来估计条件。这将仅显示指定列的直方图统计信息。

BitCodeW的博客 418

MySQL 8.4 版本(LTS) 发布,一睹为快

如果用户想要 MySQL 数据库的最新功能、改进和bug fix,请使用创新版本(例如 8.1.x、8.2.x、8.3.x 等)。如果用户 MySQL 只需要错误修复,请使用 8.0.x 版本(例如 8.0.35、8.0.36、8.0.37 等)。如果用户使用的是国内云厂商的RDS MySQL 数据库服务,具体版本支持计划请参考各个厂商的相关公告。言归正传,聊聊 8.4 的技术特性。

neeef_se的博客 1354

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8913

MySQL逻辑备份mysqldump简介

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL 的逻辑备份工具mysqldump 文章目录一.mysqldump参数介绍二.一些mysqldump案例整理三.逻辑备份文件格式化参考文档: 一.mysqldump参数介绍 参数名 描述 启用 弃用 –add-drop-database 在create database语句前带上drop database语句 –add-drop-table 在create table语句前带上 drop table语句

只是甲的博客 948

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 120

openEuler 22.03 安装 openGauss 5.0.2 部署手册

openEuler 22.03 安装 openGauss 5.0.2 部署手册

全国服务器高效代维 1424

MySQL 8.0与5.6实战对比:从性能优化到安全升级的全面解析

本文深入对比了MySQL 8.0与5.6在性能、安全与功能上的核心差异。MySQL 8.0针对现代硬件与应用需求,在默认配置、InnoDB引擎、并行查询、安全策略(如角色管理、TDE加密)及开发效率(如窗口函数)方面实现了全面飞跃,是系统升级与架构选型的优选。

ggg99的专栏 430

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 304

MySQL 8.0索引调优实战:从执行计划到慢查询优化

数据库性能优化中,索引设计是关键一环,而MySQL 8.0的索引机制相比旧版有了显著升级。理解B+树的叶子节点有序链表和联合索引最左前缀原理,是避免索引失效的基础。通过EXPLAIN分析执行计划,结合key_len、rows、Extra等关键列,能快速定位全表扫描和filesort问题。MySQL 8.0的降序索引、不可见索引和函数索引,为排序、隐藏测试、函数查询等场景提供了更精细的解决手段。慢查询日志和optimizer_trace则帮助探查优化器决策过程。以三百万行订单表的真实案例为线索,分享从慢查询定

weixin_30225755的博客 233

【即插即用模块】卷积篇 | TCSVT 2025 | MFACB:多尺度膨胀融合,快速扩大感受野,多尺度特征精准捕捉!

本文提出了一种新型多尺度融合膨胀卷积模块MFACB,用于增强语义分割任务中的特征表达能力。该模块通过三分支串联膨胀卷积结构快速扩大感受野,采用双路径融合机制(基础信息路径+多尺度信息路径)实现高效上下文聚合。相比传统卷积块,MFACB在保持轻量化的同时显著提升了多尺度特征捕捉能力,实验表明其性能优于基础残差块。该模块支持自定义膨胀率和步长调整,可灵活嵌入不同网络阶段,适用于需要特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 311

一文搞懂蚁群算法Ant Colony Optimization(ACO)!!!(灵感起源+数学原理+代码实现+实战应用)

本文系统介绍了蚁群算法的原理与实现。首先从蚂蚁觅食行为出发,阐释了信息素正反馈机制如何引导群体找到最短路径。随后详细解析了算法的数学模型,包括状态转移规则和信息素更新机制。通过MATLAB代码演示了算法在旅行商问题(TSP)中的应用,展示了路径构建和优化的完整流程。最后讨论了算法的优势、局限性和实际应用场景。蚁群算法通过模拟生物智能,为解决复杂优化问题提供了一种高效方法,其核心在于信息素的正反馈机制与随机探索的平衡。

qq_42212808的博客 887

Lingbot-Depth-Pretrain-ViTL-14 与MySQL集成:海量图像深度信息存储与检索方案

本文介绍了如何在星图GPU平台上自动化部署👁️lingbot-depth-pretrain-vitl-14镜像,构建海量图像深度信息处理与存储方案。该方案的核心是将模型生成的图像深度信息(如平均深度、特征向量)结构化存储于MySQL数据库,并实现高效的相似图像检索,典型应用于电商平台根据“主体突出、背景虚化”等深度特征筛选商品主图的场景。

weixin_33750664的博客 103

基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的单相整流系统中PR(比例谐振)控制器的设计与实现方法。首先阐述了PR控制器相较于传统PI控制器的优势,能够有效消除交流信号跟踪中的稳态误差。接着系统讲解了PR控制器的传递函数原理、实用型设计(带带宽)及参数整定方法。通过Simulink建模步骤,包括主功率电路搭建、电压外环PI设计、电流指令生成、PR控制器实现(推荐MATLAB Function方法)和SPWM调制等关键环节。仿真对比显示PR控制在电流跟踪精度(THD仅1.9%)、功率因数(0.998)和动态响应(突变恢

amy_mhd的博客 689

MySQL索引的缺点:从B+树到写放大的代价全解析

索引是数据库查询加速的基石,底层依赖B+树数据结构,以额外的磁盘空间和写入维护换取检索效率。但任何技术都有代价:每增加一个索引,写入操作就要同步维护多棵B+树,带来显著的写放大效应,同时索引页占用的存储可能超出预期。业务高峰期,过多索引会拖垮INSERT/UPDATE性能;隐式类型转换、统计信息不准还会导致索引失效,使优化器放弃走索引。面对这些问题,覆盖索引、合理控制索引数量、定期ANALYZE TABLE是常见优化手段。本文基于InnoDB实践,深入分析MySQL索引的各类缺点,帮助开发者在表设计阶段平衡

weixin_34274029的博客 303

制作你自己的yolov5数据集并进行训练

项目地址:make-your-yolov5_dataset 一、数据集标注软件 labelImg labelMe 精灵标注助手 更多的标注工具你可以去看:深度学习图像标注工具汇总 、 十个最常用深度学习图像/视频数据标注工具 、 百度一下 在这里我选择使用labelImg 二、数据集标注 下载labelImg 解压,直接打开labelimg.exe labelImg标注数据 标注完成后即可获得VOC格式(生成.xml文件)的数据 目录结构: dataset │ ├─Annotations .

年少的勇气已经用完,剩下的就是三思而后行 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?

阿里妹导读:在刚刚结束的乌镇世界互联网大会上,阿里云自主研发的POLARDB云原生数据库当选世界互联网领先科技成果,凭实力站上C位。这个”包管“了北京市每天800万人次的公交出行的下一代分布式数据库到底有多强大?我们请阿里云智能数据库事业部总经理鸣嵩跟大家一起聊聊。 POLARDB 是阿里云自主研发的下一代云原生分布式数据库。POLARDB 100%兼容MySQL、PostgreSQL等开源数...

阿里云云栖号 1247

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 图文结合带你搞懂MySQL日志之Redo Log(重做日志)
下一篇: MySQL分区表对NULL值的处理
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值