首页 > 数据库 >MySQL8.0直方图详解

MySQL8.0直方图详解

时间:2024-09-16 12:06:37浏览次数:1  
标签:name 索引 直方图 详解 MySQL8.0 数据分布 TABLE col

1、什么是直方图

MySQL8.0开始支持索引之外的数据分布统计信息可选项。它就是直方图(Histogram)。

直方图通过估算查询谓词的选择率,以便选择合适的执行计划,也让SQL优化有了更多手段。

在DB中,优化器负责将SQL转换为很多个不同的执行计划,然后从中选择一个最优的来实际执行。但是有时候优化器选择的最终计划有可能随着DB环境的变化不是最优的,这就导致了查询性能不是很好。

比如,优化器无法准确的知道每张表的实际行数以及参与过滤条件的列有多少个不同的值。当然不同类型的索引也可以解决这个问题,但是你不能每个列都建索引吧?

如果一张表有1000个字段,那全字段索引将会拖死对这张表的写入。而且但索引维护的代价更高,索引统计信息也有不可靠的时候,例如存在数据倾斜,或者统计延迟等问题,索引要保持更新,而直方图可以按需手动更新。此时,直方图就是相对来说,开销较小的方法。

当然了,直方图还是无法代替索引,只在一些特定的场景里比较有用。

可以通过以下方式来创建或者删除直方图:

ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name] WITH N BUCKETS;
ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name];

buckets默认是100,范围是1-1024。统计直方图的信息存储在数据字典表 column_statistcs 中,可以通过视图information_schema.column_statistcs访问。

直方图以灵活的JSON的格式存储。ANALYZE TABLE会基于表大小自动判断是否要进行取样操作。

ANALYZE TABLE也会基于表中列的数据分布情况以及bucket的数量来决定是否要建立等宽直方图(singleton)还是等高直方图(equi-height)。

2、直方图工作原理

MySQL支持两种直方图模式:等宽、等高。等宽直方图是每个桶保存一个值以及这个值累积频率,等高直方图每个桶需要保存不同值的个数,上下限以及累积频率等。

MySQL会自动选用哪种类型的直方图,无需也不能指定。一般来说,数据数据分布范围比较大的话就采用等高,反之,如果数据分布比较小就采用等宽。

截止MySQL 8.0.19版本,直方图支持多种数据类型和场景,甚至包括虚拟列。但不支持以下几种情况:

  • 加密表、临时表。
  • JSON数据类型、空间(spatial)数据类型。
  • 已创建唯一索引的单列。

来看一个直方图 COLUMN_STATISTICS 中存储的统计信息:

 

 

上面这个等高直方图,共100个桶,每个桶的数据量从2571 ~ 2620不等,总数据量259550,占比99.9667%。

此外,还有大约0.033%为NULL的记录。再来个等宽的直方图

 

 

等宽直方图里,每个桶里记录是各个值的分布信息。

3、直方图做了什么

如果你想要知道直方图做了什么,最简单的方式就是看一下执行计划。举个例子:

 

 

可以看到filtered列,从默认的11.11%变成了更精确的32.12%。但是,如果有多个条件,有些有直方图,有些没有,就比较难判断优化器做了什么改进:

如果想要知道更多关于直方图统计的细节,可以使用trace:

 

 

这里用了JSON_EXTRACT从trace里取出相关的部分。对于每个条件,直方图被使用的话,就会看到估算过的字段的选择性。

在这个例子里,通过直方图,对“c_birth_day <= 20”条件,估算出63.76%的数据满足条件。事实上,与实际的数据分布情况基本一致。

标签:name,索引,直方图,详解,MySQL8.0,数据分布,TABLE,col
From: https://www.cnblogs.com/shujuyr/p/18266171

相关文章

  • 常用的运维工具:文件传输工具详解(SCP, SFTP)
    在信息技术(IT)运维中,文件传输是日常工作中不可或缺的一部分。运维工程师需要高效、安全地在不同服务器之间传输文件,以确保系统的正常运行和数据的完整性。本文将详细介绍两种常用的文件传输工具——SCP(SecureCopyProtocol)和SFTP(SecureFileTransferProtocol),帮助读者更好......
  • ICM20948 DMP代码详解(24)
    接前一篇文章:ICM20948DMP代码详解(23) 上一回解析完了inv_icm20948_set_lowpower_or_highperformance函数,本回回到inv_icm20948_initialize_lower_driver函数中,继续往下解析。为了便于理解和回顾,再次贴出inv_icm20948_initialize_lower_driver函数源码,在EMD-Core\sources\Inv......
  • ICM20948 DMP代码详解(23)
    接前一篇文章:ICM20948DMP代码详解(22) 上一回解析完了inv_icm20948_wakeup_mems函数,本回回到inv_icm20948_initialize_lower_driver函数中,继续往下解析。为了便于理解和回顾,再次贴出inv_icm20948_initialize_lower_driver函数源码,在EMD-Core\sources\Invn\Devices\Drivers\IC......
  • python的os模块的常见函数及用途详解
    os模块提供了与操作系统进行交互的功能。它允许你执行许多常见的文件系统任务,如读取目录、处理文件、获取系统信息等。以下是一些os模块中常见的函数及其用途:目录操作os.getcwd():返回当前工作目录的字符串表示。os.listdir(path):返回指定目录下的文件和子目录列表。os.mkdir(......
  • Java零基础-replace(CharSequence target, CharSequence replacement)详解
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • SpringBoot权限认证-Sa-Token的使用与详解
    本文详细介绍了Sa-Token在Java项目中的使用方法,包括Sa-Token的基本概念、与其他权限框架的比较、基本语法和高级用法,并通过实例讲解了如何在项目中集成和使用Sa-Token。作为一款轻量级Java权限认证框架,Sa-Token在简化权限管理、提高开发效率方面发挥了重要作用。本文还将深入探讨Sa......
  • opencv学习:calcHist 函数绘制图像直方图及代码实现
    cv2.calcHist函数是OpenCV库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。函数语法hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate=False)......
  • 【MySQL】MySQL索引与事务的透析——(超详解)
    前言......
  • 详解c++多态---上
    virtual关键字1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一。classPerson{public:virtualvoidBuyTicket(){cout<<"买票-全价"<<endl;}};classStudent:publicPerson{public:virtualvoidBuyTicket(){cout<<"买票-半价"<<......
  • 详解 Linux 系统下的进程(下)
    目录一.进程控制1.进程创建a.Linux系统中,如何创建一个进程?b.进程创建成功后,Linux底层会为其做些什么?2.进程终止a.什么是进程终止?b.进程终止的方法有哪些?c.exit 与_exit的区别3.进程等待a.什么进程等待? b.为什么要进程等待?c.如何进行进程等待?①wait②waitp......