为什么:
mysql执行一条query语句,按步骤来就是建立连接-》词法分析-》语法分析-》优化器-》执行器-》innodb引擎。这里的问题出在优化器这里,优化器的其中一个作用就是执行计划的生成以及索引的选择。我们知道优化器选择索引有几个指标:扫描的行数,是否使用临时表,是否排序。我遇到的情况因为没使用排序可以只考虑扫描行数的问题,mysql统计扫描行数是采用的采样统计的方式取做统计,所以如果你的表数据平常不断地删除历史数据和新增数据,就会导致采样统计不准确。至于为什么要采样统计,因为一行行统计代价太高。
怎么解决:
解决方案有使用force index强行选择一个索引;修改sql语句,引导mysql使用我们期望的索引;新建更合适的索引或者删除误用的索引