副问题[/!--empirenews.page--]
【新品产上线啦】51CTO播客,随时随地,碎片化进修
概览
MySQL8.0实现了统计直方图。操作直方图,用户可以对一张表的一列做数据漫衍的统计,出格是针对没有索引的字段。这可以辅佐查询优化器找到更优的执行打算。统计直方图的首要行使场景是用来计较字段选择性,即过滤服从。
可以通过以下方法来建设可能删除直方图:
- 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。统计直方图的信息存储在数据字典表"column_statistcs"中,可以通过视图information_schema.COLUMN_STATISTICS会见。直方图以机动的JSON的名目存储。ANALYZE TABLE会基于表巨细自动判定是否要举办取样操纵。ANALYZE TABLE也会基于表中列的数据漫衍环境以及bucket的数目来抉择是否要成立等宽直方图(singleton)照旧等高直方图(equi-height)。
什么是直方图
数据库中,查询优化器认真将SQL转换成最有用的执行打算。偶然辰,查询优化器会走不到最优的执行打算,导致耗费了更多不须要的时刻。造成这种环境的首要缘故起因是,查询优化器偶然无法精确的知道以下几个题目的谜底:
- 每个表有几多行?
- 每一列有几多差异的值?
- 每一列的数据漫衍环境?
举例声名:一张简朴的表,两个字段,一个字段是person_id,另一个字段是time_of_day,暗示睡觉时刻
- CREATE TABLE bedtime (
- person_id INT,
- time_of_day TIME);
对付time_of_day列,大部门人上床时刻会在晚上11:00阁下。以是下面第一个查询会比第二个查询返回更多的行数:
- 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支持了两种:等宽直方图(singleton)、等高直方图(equi-height)。直方图的配合点是,它们都将数据分到了一系列的buckets中去。MySQL会自动将数据划到差异的buckets中,也会自动抉择建设哪种范例的直方图。
怎样建设和删除统计直方图
为了打点统计直方图,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];
第一个暗示一次可觉得一个或多个列建设统计直方图:
- mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount WITH 32 BUCKETS;
- +----------------+-----------+----------+---------------------------------------------------+
- | Table | Op | Msg_type | Msg_text |
- +----------------+-----------+----------+---------------------------------------------------+
- | sakila.payment | histogram | status | Histogram statistics created for column 'amount'. |
- +----------------+-----------+----------+---------------------------------------------------+
- 1 row in set (0.27 sec)
- mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount, payment_date WITH 32 BUCKETS;
- +----------------+-----------+----------+---------------------------------------------------------+
- | Table | Op | Msg_type | Msg_text |
- +----------------+-----------+----------+---------------------------------------------------------+
- | sakila.payment | histogram | status | Histogram statistics created for column 'amount'. |
- | sakila.payment | histogram | status | Histogram statistics created for column 'payment_date'. |
- +----------------+-----------+----------+---------------------------------------------------------+
buckets的值必需指定,可以配置为1到1024,默认值是100。
对付差异的数据荟萃,buckets的值取决于以下几个身分:
- 这列有几多差异的值
- 数据的漫衍环境
- 必要多高的精确性
可是,某些buckets的值能晋升的关于数据漫衍环境的精确性相等低。以是,提议的做法是,开始的时辰将buckets的值设的低一点,好比32,然后假如没有满意祈望,再往上增大。
上面这个例子中,我们对付amount列成立了两次直方图。第一个语句,成立了一个新的直方图;第二个语句,amount列的直方图被重写了。
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|