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掉,导入数据
在这种情况下就会使用analyze table 命令2次
上面是2次,ANALYZE TABLE命令进行修复索引。在不停的浮动。 分析表通过对每个索引树执行随机潜水并相应地更新索引基数估计值来确定索引基数,所以这个值也不是100%准确。
ANALYZE TABLE的作用:
- 统计索引分布信息。
- 对于 MyISAM 表,相当于执行了一次 myisamchk --analyze
- 支持 InnoDB.NDB.MyISAM 等存储引擎,但不支持视图(view)
- 执行时,会对表加上读锁(read lock)
- 该操作会记录binlog,可以在analyze和table之间添加关键字local取消写入
ANALYZE TABLE风险:
- analyze table的需要扫描的page代价粗略估算公式:sample_pages * 索引数 * 表分区数。
- 因此,索引数量较多,或者表分区数量较多时,可能会比较费时,要评估代价,并默认只在负载低谷时执行。
- 如果某个表上当前有慢SQL,此时执行analyze table,则该表后续的查询均会处于waiting for table flush的状态,严重的话会影响业务,因此执行前必须先检查有无慢查询。
直方图
通过ANALYZE操作了解到,在数据库中查询优化所需的指标抽取方式。有时候,查询优化器会走不到最优的执行计划,导致花费了更多不必要的时间。直方图就是解决这样的问题.
直方图能近似获得一列的数据分布情况,从而让数据库知道它含有哪些数据。将数据分到了一系列的buckets中去。MySQL会自动将数据划到不同的buckets中,也会自动决定创建哪种类型的直方图。
1)从代码实现中,MySQL支持了两种:等宽直方图(singleton).等高直方图(equi-height)。
2)两个直方图区别在于equi-height 多了 下限和上限的指标。
3)选择直方图判断逻辑是:如果指定的桶数大于或等于桶数 对于不同的值,创建一个单例直方图。否则创建一个等高直方图。
...
本文接下来还有:
- 直方图命令
- 测试
- 总结
完整内容,请访问墨天轮平台【原文】进行查看~