专注,勤学,慎思。戒骄戒躁,谦虚谨慎

just do it

导航

(译)MySQL中的直方图统计信息

什么是直方图,在MySQL 8.0.3如何创建直方图?
MySQL的直方图是如何影响执行计划生成的?
创建直方图有哪些注意事项?
直方图和索引对优化器的选择上有什么差异,又该如何选择?
如何判断直方图对执行计划的影响?
MySQL官方blog的这篇文章用非常具体的示例回答了这一系列问题,let's go。
原文地址为https://dev.mysql.com/blog-archive/histogram-statistics-in-mysql/,以下为译文:
 
 
从MySQL 8.0.3开始,您可以创建直方图统计信息,以便向优化器提供更多的统计信息。在这篇博文中,我们将看看如何创建直方图统计数据,并解释何时使用直方图统计数据可能有用。

什么是直方图

查询优化器是数据库中负责将SQL查询转换为尽可能高效的执行计划的部分。有时,查询优化器无法找到最有效的计划,并最终花费比所实际所需更多的时间来执行查询。出现这种情况的主要原因通常是优化器对它要查询的数据分布没有足够的了解:
  • 每个表中有多少行?
  • 每一列有多少不同的值?
  • 数据如何分布在每一列中?
一个查询优化器缺少重要信息的示例,人们每天睡觉时间的数据表:
CREATE TABLE bedtime (
  person_id INT,
  time_of_day TIME);
对于“time_of_day”这个字段,大多数值很可能是在11:00PM左右,因为大多数人是在这个时间段睡觉的。所以下面第一个查询返回的数据行数要比第二个查询返回的数据要多。
1) SELECT * FROM bedtime WHERE time_of_day BETWEEN "22:00:00" AND "23:59:00"
2) SELECT * FROM bedtime WHERE time_of_day BETWEEN "12:00:00" AND "14:00:00"
在没有任何统计数据可用的情况下,优化器将假设“time_of_day”中的值是均匀分布的(即,一个人在下午3点左右睡觉的可能性与晚上11点左右睡觉的可能性相同)。如何使查询优化器意识到数据中的这种偏斜度?对此的一个解决方案是为该列创建直方图统计信息。
直方图是一列数据分布的近似值。它可以相当准确地告诉您,您的数据是否有偏差,这反过来将帮助数据库服务器理解它所包含的数据的性质。直方图有很多不同的风格,在MySQL中我们选择支持两种不同的类型:“单例(等宽)”直方图和“等高”直方图。所有直方图类型的共同点是,它们将数据集分割为一组“桶”,MySQL自动将值划分为桶,并自动决定创建什么类型的直方图。

如何创建和删除直方图统计

为了管理直方图统计数据,我们扩展了ANALYZE TABLE,增加了两个新的子句:

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];

posted on 2022-12-05 11:10  MSSQL123  阅读(211)  评论(0编辑  收藏  举报