InnODB和MyISAM索引统计集合
这篇讲的是MySQL优化器如何收集和使用索引统计信息来做出查询决策。作者从`myisam_stats_method`变量入手,详细解释了InnoDB和MyISAM如何统计“平均数值组”——即拥有相同索引键值的平均行数。 关键点在于,这个平均数值组越小,说明索引的区分度(Cardinality)越高,优化器就越倾向于使用它。文章通过一个实例直观展示了这一点:一张千行表的主键Cardinality为966,计算出的平均数值组约为1.04,意味着每个主键值平均只指向约1行数据,索引效率很高。 文章的重点对比在于两种存储引擎处理NULL值的策略差异。通过`NULLS_EQUAL`、`NULLS_UNEQUAL`和`NULLS_IGNORED`三种统计方法,优化器会对NULL值有不同的“看法”,从而影响平均数值组的计算结果。例如,`NULLS_EQUAL`会把所有NULL视为相同,这在NULL值非常多的情况下会大幅降低Cardinality,导致优化器错误地放弃本应使用的索引。而`NULLS_UNEQUAL`(MyISAM的默认策略)则将每个NULL视为独立的组,更适合NULL值不占主导的场景。 理解这些统计信息的收集机制,能帮助我们更清晰地认识为什么`Cardinality`值越大、索引通常越好,并在设计表结构或排查索引失效问题时,考虑到NULL值分布可能带来的影响。