为什么MySQL会选错索引?
根据SQL的执行过程可以知道,选择索引是优化器的工作,而优化器会选择一个它认为最优的执行计划。
最优的执行计划一般由扫描的行数,临时表及排序等因素决定。对于简单的查询语句来说,如果MySQL选错了索引,那必然是扫描的行数的时候出现了问题。
MySQL扫描行数的策略
一般来说,常规的扫描会对所有行进行统计,但MySQL统计扫描行数并不是这样,因为扫描所有行会进行太多的磁盘IO,导致性能下降。所以MySQL采用的是这样的一种扫描策略:MySQL会对索引进行采样,具体方式为选择N个索引的页,统计每一页上的不同值的数量,然后取平均值后乘以页的个数得到基数,该基数作为统计值。通过这样的计算方式可以发现,这个基数很可能是一个不准确的值,因此就可能导致优化器选错索引。
因为基数统计错误,优化器选错索引的解决办法
analyze table t可以用于修正该问题。当然这是在只是索引基数统计不准确时,可以用于解决。因为对于复杂的涉及join及排序等语句,还需要考虑其他因素。
对于存在复杂语句选错索引如何解决?
mysql> explain select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1;
假设该条语句依然会出现选错索引的问题
- 方法一:采用
force index强制选择一个索引 - 方法二:通过优化SQL语句引导优化器选择合适的索引
如何引导??需要具体分析,目前还不知道丫-。-