最近看了一些索引优化方面的资料,大多数内容都是互相抄袭,有的甚至根本讲不到点上。在此记录下我遇到的几个问题。
误区:最左匹配原则,where语句必须和索引字段顺序保持一致。
例如表user有一个索引index(`name`,`age`,`sex`)。那么,select * from user where age = 1 and name = 'test'仍然会命中这个索引。也就是说,where条件的顺序和索引顺序无关,只需要where语句中存在索引最左列字段,即可命中该索引。
问题:明明where语句写的很规范,符合索引要求,却没有命中索引。
示例:select a.* from user a inner join score b on a.stu_id = b.stu_id where a.name='test' and a.age = 20 order by a.id desc;
经分析未命中索引,原来是因为order by搞的鬼。这种情况,需要先对order by语句建立索引。需要将索引修改成index(`id`,`name`,`age`,`sex`)。
若遇到order by a.id desc,b.score asc这种,导致仍然未命中索引,需要在select语句上加上强制索引。
如:select a.* from user a force index(`index`) inner join score b on a.stu_id = b.stu_id where a.name='test' and a.age = 20 order by a.id desc;
网友评论