MySQL 中,可以为某张表指定多个索引,但在语句具体执行时,选用哪个索引是由 MySQL 中执行器确定的。那么执行器选择索引的原则是什么,以及会不会出现选错索引的情况呢?先看这样一个例子:创建表 Y,设置两个。MySQL 在执行语句前,其实并不能准确的计算出扫描的行数,而是通过数学统计信息来估算记录数。在一个索引上不同值的个数,称为“基数”。MySQL 是在获取基数时,实际上是采用。这里选择 b 作为索引的原因,是因为优化器看到了后面的 但从实际的执行时间来看,索引 a 执行时间更短,所以这里 MySQL 又选择了错误的索引。行数的扫描,主要和基数有关,而基数的统计则是通过统计抽样决定的,进而预估的行数可能会是不准确的。

MySQL选错索引的原因以及解决方案

MySQL选错索引的原因以及解决方案

MySQL选错索引的原因以及解决方案

MySQL选错索引的原因以及解决方案