MySQL中的索引可以以一定顺序引用多列,这种索引叫做联合索引。如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。如下
select * from user where name = xx and city =xx; //可以命中索引
select * from user where name = xx; //可以命中索引
select * from user where city = xx; //无法命中索引
这里需要注意的是,查询的时候如果两个条件都用上,但是顺序不同,如 city = xx and name = xx,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的。
由于最左前缀的原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。order by子句也遵循此规则。
//index(a,b,c)
where a = xx and b > 443 and c = 32; //可以命中索引
where c =32 and b = -123 and a = 123; //可以命中索引
where c =32 and a = 123; //无法命中索引
where c =32 and a = -123 and b = 123; //可以命中索引