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

MySQL 8.0新特征之统计直方图

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

可是,用直方图而不是索引有以下两个缘故起因:

  • 维护一个索引有价钱。每一次的insert、update、delete城市必要更新索引,会对机能有必然的影响。而直方图一次建设永不更新,除非明晰去更新它。以是不会影响insert、update、delete的机能。
  • 假若有索引,优化器用行使index dives技能来估算切合前提范畴的记录数目。这种方法也是有价钱的,出格是查询语句前提中有很长的IN列表。直方图相对而言价钱小,因此也许更吻合。

检索统计直方图

统计直方图以JSON的情势存在数据字典中。可以用内建的JSON函数built-in JSON functions从直方图获取一些信息。举例来说,假如必要知道amount列的直方图的建设可能更新时刻,可以用JSON unquoting extraction operator来获守信息:

  1. mysql> SELECT  
  2. ->   HISTOGRAM->>'$."last-updated"' AS last_updated  
  3. -> FROM INFORMATION_SCHEMA.COLUMN_STATISTICS  
  4. -> WHERE  
  5. ->   SCHEMA_NAME = "sakila"  
  6. ->   AND TABLE_NAME = "payment"  
  7. ->   AND COLUMN_NAME = "amount";  
  8. +----------------------------+  
  9. | last_updated               |  
  10. +----------------------------+  
  11. | 2017-09-15 11:54:25.000000 |  
  12. +----------------------------+ 

假如要查找现实有几多个buckets,以及用analyze table时指定了几多个buckets,可以如下:

  1. mysql> SELECT  
  2. ->   TABLE_NAME,  
  3. ->   COLUMN_NAME,  
  4. ->   HISTOGRAM->>'$."number-of-buckets-specified"' AS num_buckets_specified,  
  5. ->   JSON_LENGTH(HISTOGRAM, '$.buckets') AS num_buckets_created  
  6. -> FROM INFORMATION_SCHEMA.COLUMN_STATISTICS  
  7. -> WHERE  
  8. ->   SCHEMA_NAME = "sakila"; 
  9. +------------+--------------+-----------------------+---------------------+  
  10. | TABLE_NAME | COLUMN_NAME  | num_buckets_specified | num_buckets_created |  
  11. +------------+--------------+-----------------------+---------------------+  
  12. | payment    | amount       | 32                    |                  19 |  
  13. | payment    | payment_date | 32                    |                  32 |  
  14. +------------+--------------+-----------------------+---------------------+ 

经测试,num_buckets_created与字段的distinct值很靠近,近似相称;可是num_buckets_created不会大于num_buckets_specified。假如num_buckets_created与num_buckets_specified相称,那么存在也许,在建设直方图的时辰指定的buckets不足多,那么此时可以通过增进buckets的数目,来进步直方图的精确性。

buckets可以配置为1到1024

优化器trace

假如你想要知道直方图做了什么,最简朴的方法就是看一下执行打算:

  1. mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day BETWEEN 1 AND 10;  
  2. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  3. | id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra       |  
  4. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  5. |  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 98633 |    11.11 | Using where |  
  6. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  7. 1 row in set, 1 warning (0.00 sec)  
  8. mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_birth_day WITH 32 BUCKETS;  
  9. +----------------+-----------+----------+--------------------------------------------------------+  
  10. | Table          | Op        | Msg_type | Msg_text                                               |  
  11. +----------------+-----------+----------+--------------------------------------------------------+  
  12. | tpcds.customer | histogram | status   | Histogram statistics created for column 'c_birth_day'. |  
  13. +----------------+-----------+----------+--------------------------------------------------------+  
  14. 1 row in set (0.10 sec)  
  15. mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day BETWEEN 1 AND 10;  
  16. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  17. | id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra       |  
  18. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  19. |  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 98633 |    32.12 | Using where |  
  20. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  21. 1 row in set, 1 warning (0.00 sec) 

(编辑:湖南网)

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

热点阅读