加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.cn/)- AI行业应用、低代码、混合云存储、数据仓库、物联网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL 8.0新特性之统计直方图

发布时间:2018-10-02 18:39:58 所属栏目:MySql教程 来源:韩杰·沃趣科技
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 概览 MySQL8.0实现了统计直方图。利用直方图,用户可以对一张表的一列做数据分布的统计,特别是针对没有索引的字段。这可以帮助查询优化器找到更优的执行计划。统计直方图的主要使用场景是用来计算字段选

如果要查找实际有多少个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) 

(编辑:阜阳站长网)

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

热点阅读