1.如果搜索条件里有复合索引的第一个键列,则可能走该索引的seek
2.如果搜索条件里没有复合索引的第一个键列,但是有其他键列,如果指定使用该索引,那么只能是索引scan,比seek慢。
3.同样,如果搜索条件只包含include列,如果指定使用该索引,那么只能是索引scan
4.如果搜索条件包含复合索引的主列和其他列,那么走该索引的seek。
5.如果搜索条件包含索引主列和include列,那么也走该索引的seek,但是没有复合索引快。
6.为什么复合索引快?因为复合索引的所有列都可以存放在索引B树的任何节点,但是include列只能存在B树的叶子节点,也就是说复合索引可以很早就把数据过滤掉,而包含列需要到叶子才能过滤掉。
7.但也不是都要用复合索引,因为复合索引只能包含16个键列,900个字节,比如varchar(300)的列来3个就满了,include无此限制。
8.因此,只把搜索条件中的列放在复合索引里,而把需要查询的列放在include里,否则会产生key loopup。
9.此时索引会变很大,因为include多列,可以使用筛选索引来解决。