• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MySQL三列联结索引:如果where条件中没有第二列_mysql

mysql 搞代码 7年前 (2018-06-07) 234次浏览 已收录 0个评论

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 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MySQL三列联结索引:如果where条件中没有第二列_mysql

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址