在各种查询优化中,都会去建立索引,一些比较复杂的查询更可能会用到联合索引,跟单个索引一样,联合索引也有失效的时候,例如范围查询的时候(like,in,大于,小于,between)会使索引失效,停止匹配,这里要提醒自己like匹配的时候有且只有一个%在右边,索引是生效的。
建立联合索引的原则:选择区分度高的列作为索引(区分度可以这样计算:count(distinct column),使用得到的值来跟count(1)比对,差距越小区分度越高)
对于联合索引是如何匹配,需要先了解下数据库联合索引的数据存储,数据库的存储是B-TREE:
当创建一个索引的时候例如创建索引(a,b,c),会在4,10,16节点存储相应的索引key,查询语句带有a,b,c的时候,会先在key中匹配a,匹配到的集合,会在匹配b,然后在匹配完b的集合中匹配c;如果没有a,将不会去直接匹配后面的b,自然也不会匹配c,所以索引失效了;如果sql中只有a,c条件,匹配完a的时候会在匹配集合中再去匹配b,但是b不存在,所以不会再继续去匹配c,c失效了。
在实际开发中,如果想确定索引是否生效可以在查询语句前增加explain来查看