浅析MySQL 8.0直方图原理

💡 原文中文,约10800字,阅读约需26分钟。
📝

内容提要

MySQL8.0引入了直方图功能,提供关于字段值分布的统计信息,帮助优化器更准确地估计查询中的行数并选择更高效的查询计划。本文解释了直方图的概念、用法以及如何创建和删除它们。还讨论了MySQL8.0中直方图背后的原理,并提供了一个示例来说明直方图如何优化查询性能。

🔎

延伸解读

直方图类型选择:等宽与等高的自动决策

MySQL 8.0根据桶个数与不同值个数的关系自动选择直方图类型:当桶个数大于不同值个数时创建等宽直方图,否则创建等高直方图。等宽直方图每个桶保存一个具体值及其累积频率,适合值种类较少的列;等高直方图每个桶保存值范围、频率和不同值个数,适合值分布广泛或数据倾斜的列。理解这一机制有助于预判直方图对查询优化的实际效果。

创建直方图的资源控制与采样率

创建直方图时,MySQL通过histogram_generation_max_mem_size参数限制生成过程允许使用的最大内存,并据此计算采样率。采样率决定了统计信息的准确性:采样率越高,直方图越能反映真实数据分布,但消耗资源也越多。在数据量大或内存受限的场景下,优化器可能基于采样数据估算,需关注采样率对执行计划选择的影响。

数据倾斜场景下的优化收益与验证方法

文章示例显示,在数据倾斜的表中,未创建直方图时优化器错误估计行数,导致全索引扫描,耗时约1.35秒;创建直方图后,优化器选择更优的索引范围扫描,耗时降至0.11秒。这提示读者:对于where条件中过滤字段分布不均的查询,可尝试创建直方图,并通过EXPLAIN ANALYZE对比执行计划与耗时来验证优化效果。

直方图的维护与适用边界

直方图统计信息存储在系统表中,可通过INFORMATION_SCHEMA.COLUMN_STATISTICS查看,并支持使用ANALYZE TABLE语句更新或删除。但直方图并非一劳永逸:数据变化后统计信息可能过时,需重新生成。此外,直方图仅针对单表列,且目前只支持在一张表上操作,对于多表关联或复杂查询,其优化作用有限,应结合索引设计综合考量。

❓

Q&A

MySQL 8.0中的直方图有什么作用?

直方图用于统计字段值的分布情况,帮助优化器更准确地估计查询中的行数,从而选择更高效的查询计划。

如何在MySQL 8.0中创建和删除直方图?

创建直方图使用语法:ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name;删除直方图使用语法:ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name。

MySQL 8.0的直方图分为哪几种类型?

直方图分为等宽直方图和等高直方图,分别保存不同的统计信息。

直方图如何优化查询性能?

通过提供数据分布的统计信息,直方图帮助优化器选择合适的索引和优化查询语句,从而提高查询性能。

MySQL 8.0中直方图的原理是什么?

直方图的原理涉及数据采样和统计信息的存储,支持在一张表上进行操作,主要通过分析数据分布来生成直方图。

使用直方图时需要注意哪些事项?

在创建直方图时,需要考虑数据的分布情况和采样率,以确保生成的直方图能够准确反映数据特征。

🏷️

标签

➡️

继续阅读