`uid` IN ('0', '-1', '-3', '3377607')
    AND `create_at` >= 1579188367
    AND `id` < 4315022
  • 这样的一个查条件,通过explain分析后发现,扫描行200多万,使用的是主键索引
  • 去掉 AND id < 4315022 条件后,再通过explain分析后发现发现,会使用自定义的uid索引
  • 查询时间从10秒,提升到了 0.0078秒,足足提升了1000多倍的查询速度。
  • 但是业务需求中必须得加上 AND id < 4315022
  • 最后发现mysql有一个 force index的写法可以指定使用的索引
  • 在查询语句的表名后面加上 force index(uid),搞定收工

mysql可能并不总会选择合适且效率高的索引去查询,这时适当的force index(indexname) 强制告诉mysql使用什么索引尤为重要

  • 备注:如果 AND id < 4315022 改成 AND id > 4315022 的时候,mysql还是能正常使用 uid 这个索引的,不能正确使用,那我们就告诉mysql怎么使用就可以了。