MySQL直方图
MySQL8.0开始支持索引之外的数据分布统计信息可选项
我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选择一个最优的来实际执行。但是有时候优化器选择的最终计划有可能随着DB环境的变化不是最优的,这就导致了查询性能不是很好。比如,优化器无法准确的知道每张表的实际行数以及参与过滤条件的列有多少个不同的值。那其实有时候有人就说了,索引不是可以解决这个问题吗?是的,不同类型的索引可以解决这个问题,但是你不能每个列都建索引吧?如果一张表有1000个字段,那全字段索引将会拖死对这张表的写入。而此时,直方图就是相对来说,开销较小的方法。
支持两种直方图模式:
等宽(singleton),每个桶只有一个值,保存该值和累积的频率
等高(equi-height),每个桶保存上下限,累积频率以及不同值得个数
MySQL会自动分配用哪种类型得直方图,我们无需参与
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
统计信息持久化存储在mysql.column_statistics表中(不可见表),每行记录对应一个字段的直方图,以json保存
可以从I_S.column_statistics中引用查看
select json_pretty(histogram) from information_schema.column_statistics\G
统计结果中的sampling-rate表示采样比例,越高消耗内存越多
histogram_generation_max_mem_size可限制内存使用上限,默认20MB
为什么需要直方图:
索引维护代价高,总是要保持更新
而直方图是用户按需更新,代价更低
直方图有以下限制:
不支持几何类型以及json
不支持加密表和临时表
不支持列值完全唯一
需要手工的进行键值分布
https://blog.csdn.net/wukong_666/article/details/80895557