加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL 8.0新特征之统计直方图

发布时间:2018-09-20 23:49:09 所属栏目:编程 来源:韩杰·沃趣科技
导读:【新品产上线啦】51CTO播客,随时随地,碎片化进修 概览 MySQL8.0实现了统计直方图。操作直方图,用户可以对一张表的一列做数据漫衍的统计,出格是针对没有索引的字段。这可以辅佐查询优化器找到更优的执行打算。统计直方图的首要行使场景是用来计较字段选
副问题[/!--empirenews.page--] 【新品产上线啦】51CTO播客,随时随地,碎片化进修

 MySQL 8.0新特征之统计直方图

概览

MySQL8.0实现了统计直方图。操作直方图,用户可以对一张表的一列做数据漫衍的统计,出格是针对没有索引的字段。这可以辅佐查询优化器找到更优的执行打算。统计直方图的首要行使场景是用来计较字段选择性,即过滤服从。

可以通过以下方法来建设可能删除直方图:

  1. ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name] WITH N BUCKETS;  
  2. 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,暗示睡觉时刻

  1. CREATE TABLE bedtime (  
  2. person_id INT,  
  3. time_of_day TIME); 

对付time_of_day列,大部门人上床时刻会在晚上11:00阁下。以是下面第一个查询会比第二个查询返回更多的行数:

  1. 1) SELECT * FROM bedtime WHERE time_of_day BETWEEN "22:00:00" AND "23:59:00"  
  2. 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呼吁新增了两个子句:

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

第一个暗示一次可觉得一个或多个列建设统计直方图:

  1. mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount WITH 32 BUCKETS;  
  2. +----------------+-----------+----------+---------------------------------------------------+  
  3. | Table          | Op        | Msg_type | Msg_text                                         |  
  4. +----------------+-----------+----------+---------------------------------------------------+  
  5. | sakila.payment | histogram | status   | Histogram statistics created for column 'amount'. |  
  6. +----------------+-----------+----------+---------------------------------------------------+  
  7. 1 row in set (0.27 sec)  
  8. mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount, payment_date WITH 32 BUCKETS;  
  9. +----------------+-----------+----------+---------------------------------------------------------+  
  10. | Table          | Op        | Msg_type | Msg_text                                                |  
  11. +----------------+-----------+----------+---------------------------------------------------------+  
  12. | sakila.payment | histogram | status   | Histogram statistics created for column 'amount'.       |  
  13. | sakila.payment | histogram | status   | Histogram statistics created for column 'payment_date'. |  
  14. +----------------+-----------+----------+---------------------------------------------------------+ 

buckets的值必需指定,可以配置为1到1024,默认值是100。

对付差异的数据荟萃,buckets的值取决于以下几个身分:

  •  这列有几多差异的值
  •  数据的漫衍环境
  •  必要多高的精确性

可是,某些buckets的值能晋升的关于数据漫衍环境的精确性相等低。以是,提议的做法是,开始的时辰将buckets的值设的低一点,好比32,然后假如没有满意祈望,再往上增大。

上面这个例子中,我们对付amount列成立了两次直方图。第一个语句,成立了一个新的直方图;第二个语句,amount列的直方图被重写了。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读