mysql三列联合索引:如果where条件中没有第二列
MySQL三列联合索引:如果where条件中没有第二列,那末索引中只有第一列部分在起作用。
假设索引是: <姓,名,性别>
下面这条语句时在运行时,只能用到”姓“这一列上的索引。
select ... where 姓='chen' and 性别='male'
这个也不难理解。
联合索引可以理解为:对”姓“建一棵B-树,在这棵树的每个叶子结点下挂上”名“的B-树,最后再在“名”的B-树的每个叶子结点下挂上“性别”的B-树。
select ... where 姓='chen' and 名='jian' and 性别='male'
上面的sql语句先走“姓”树,找到所有姓”chen”的结点,这些结点下都各自挂了一棵“名”树;然后分别系统从这些“名”树中找到所有名为”jian”的结点; 以此类推,最后在“性别”树中找到所有性别为”male”的叶子结点。然后返回数据。
如果查询中没有第2列,如
select ... where 姓='chen' and 性别='male'
遍历的过程就是:先走“姓”树,找到所有姓”chen”的结点;由于未给出“名”的条件,只好把“姓树”中所有姓=”chen”下面挂的所有子树的叶子结点都找出来,然后一个一个看这个结点的性别值是否为”male”.
如果sql这样写呢?
select ... where 姓='chen' and 名 like 'j%' and 性别='male'
答案:MySQL也只会用到“姓”上的索引。 “like ‘j%’ 属于range query, MySQL在这种情况下也会弃用第二及其之后的索引。
p.s. 既然range query都这样,可见下面的sql语句也只会用到”姓“上的索引
select ... where 姓='chen' and 名 >= 'j%' and 性别='male'
以上结论也适用于order by的情形。下面这条语句运行时也只能用到“姓”上的索引。
select ... order by 姓, 性别
欢迎大家阅读《MySQL三列联结索引:如果where条件中没有第二列_mysql》,跪求各位点评,by 搞代码