使用force index强制指定索引

最近日账汇总存在部分店铺初始化数据timeout的情况,查询数据库的时候发现,一个简单insertSelect语句,不同的店铺,走的索引居然不一样,先直接看当时的情况。

根据explain的分析结果
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

可以看到同样的sql在某种情况下突然走了index_merge,而不走ref了,导致执行时间增加了好几倍

原因是explain 解释器从语法上会走到2个索引,但实际上当实际执行查询的时,即使有多个单列索引,MySQL只能使用一个索引,当有2个单列的索引,MySQL会试图选择一个限制最严格的索引,大量数据时也有可能会索引失效。

所以应该强制指定索引

【强制索引语法】:

select * from table_name [ force index( idx_name ) ] where condition

故改为这样之后就好多了

此处评论已关闭