可是,用直方图而不是索引有以下两个缘故起因:
- 维护一个索引有价钱。每一次的insert、update、delete城市必要更新索引,会对机能有必然的影响。而直方图一次建设永不更新,除非明晰去更新它。以是不会影响insert、update、delete的机能。
- 假若有索引,优化器用行使index dives技能来估算切合前提范畴的记录数目。这种方法也是有价钱的,出格是查询语句前提中有很长的IN列表。直方图相对而言价钱小,因此也许更吻合。
检索统计直方图
统计直方图以JSON的情势存在数据字典中。可以用内建的JSON函数built-in JSON functions从直方图获取一些信息。举例来说,假如必要知道amount列的直方图的建设可能更新时刻,可以用JSON unquoting extraction operator来获守信息:
- mysql> SELECT
- -> HISTOGRAM->>'$."last-updated"' AS last_updated
- -> FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
- -> WHERE
- -> SCHEMA_NAME = "sakila"
- -> AND TABLE_NAME = "payment"
- -> AND COLUMN_NAME = "amount";
- +----------------------------+
- | last_updated |
- +----------------------------+
- | 2017-09-15 11:54:25.000000 |
- +----------------------------+
假如要查找现实有几多个buckets,以及用analyze table时指定了几多个buckets,可以如下:
- mysql> SELECT
- -> TABLE_NAME,
- -> COLUMN_NAME,
- -> HISTOGRAM->>'$."number-of-buckets-specified"' AS num_buckets_specified,
- -> JSON_LENGTH(HISTOGRAM, '$.buckets') AS num_buckets_created
- -> FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
- -> WHERE
- -> SCHEMA_NAME = "sakila";
- +------------+--------------+-----------------------+---------------------+
- | TABLE_NAME | COLUMN_NAME | num_buckets_specified | num_buckets_created |
- +------------+--------------+-----------------------+---------------------+
- | payment | amount | 32 | 19 |
- | payment | payment_date | 32 | 32 |
- +------------+--------------+-----------------------+---------------------+
经测试,num_buckets_created与字段的distinct值很靠近,近似相称;可是num_buckets_created不会大于num_buckets_specified。假如num_buckets_created与num_buckets_specified相称,那么存在也许,在建设直方图的时辰指定的buckets不足多,那么此时可以通过增进buckets的数目,来进步直方图的精确性。
buckets可以配置为1到1024
优化器trace
假如你想要知道直方图做了什么,最简朴的方法就是看一下执行打算:
- mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day BETWEEN 1 AND 10;
- +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+
- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+
- | 1 | SIMPLE | customer | NULL | ALL | NULL | NULL | NULL | NULL | 98633 | 11.11 | Using where |
- +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+
- 1 row in set, 1 warning (0.00 sec)
- mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_birth_day WITH 32 BUCKETS;
- +----------------+-----------+----------+--------------------------------------------------------+
- | Table | Op | Msg_type | Msg_text |
- +----------------+-----------+----------+--------------------------------------------------------+
- | tpcds.customer | histogram | status | Histogram statistics created for column 'c_birth_day'. |
- +----------------+-----------+----------+--------------------------------------------------------+
- 1 row in set (0.10 sec)
- mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day BETWEEN 1 AND 10;
- +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+
- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+
- | 1 | SIMPLE | customer | NULL | ALL | NULL | NULL | NULL | NULL | 98633 | 32.12 | Using where |
- +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+
- 1 row in set, 1 warning (0.00 sec)
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|