MySQL 8.0 InnoDB 的统计信息机制优化

图片 from 通义万相

前言

MySQL 的InnoDB引擎会维护着用户表每个索引的统计信息,来帮助查询优化器选择最优的执行计划,详细的来说,key的分布情况能决定多表join的顺序,也能够决定查询使用哪一个索引。这些统计信息可以由专门的后台线程刷新,也可以由用户也可以显示的调用Analyze table的命令来刷新统计信息,本文基于最新的 MySQL 8.0 来具体分析一下刷新统计信息的具体实现。

统计信息收集触发以及查看

MySQL有多种方法会触发统计信息的收集,显示的最典型就是Analyze Table 语法,并且由于在MySQL 8.0 中支持了直方图统计信息, 因此analyze table 还扩充了Histogram语法

ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]<br>    TABLE tbl_name [, tbl_name] ...<br><br>ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]<br>    TABLE tbl_name<br>    UPDATE HISTOGRAM ON col_name [, col_name] ...<br>        [WITH N BUCKETS]<br><br>ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]<br>    TABLE tbl_name<br>    DROP HISTOGRAM ON col_name [, col_name] ...<br>