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>