MySQL8.0 新功能直方图,继承于Oracle ,MairaDB的实现方式。
那下面从mysql角度认识下,直方图是什么。先看下官方直方图的实现方式。
从上图上可以看到原来是ANALYZE命令。先了解一下MySQL里 ANALYZE命令到底有什么用。
ANALYZE
在MySQL里提交一条查询SQL语句时,优化器会选在一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着资源资源越少,扫描行数是怎么判断,是通过索引的基数来得到值和row。
mysql>SHOW INDEX FROM table_name
执行计划里出现的Cardinality(基数)字段,是非常重要的:
基数计算是采样统计,如果把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高。采样统计的时候InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。而数据表是会持续更新的,索引统计信息也不会固定不变。所以,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。
基数很容易不准,除了基数优化器还要判断,执行这个语句本身要扫描多少rows 预计扫描行数.
因为统计信息不对,cardinality大大少于数据的实际散列程度,那么索引就有可能失效。
下面看看基数变化的情况:
1.第一次创建表导入数
2.第二次把表drop掉,导入数据