请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

最左匹配问题

最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整;
后面不是太理解 建立了(a,b,d,c) 的索引 查询条件是a = 1 and b = 2 and c > 3 and d = 4 的时候 匹配索引的时候,先匹配到a 再匹配到b ,然后c>3 跳过, 再匹配到 d=4嘛 那这个c的索引还需要再回去匹配一次嘛 还是mysql自动优化了这个条件顺序 变成 a = 1 and b = 2 and d = 4 and c > 3 这个样子 匹配的 所以abdc的所以索引都能用到的,这个匹配的过程不是太理解

正在回答 回答被采纳积分+3

1回答

张勤一 2019-03-20 19:06:18

同学你好:

    我对你这里提出的问题作出一些拆解回答:

    1. a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的:这是因为其中的 c 列匹配使用了 >,根据 mysql 的规则,遇到 > 则会停止使用索引。所以,不会使用到 d 索引;

    2. a、b、d 的顺序之所以可以互换,是因为你在查询的时候,MySQL 的语法树会根据表中的索引对你的查询语句做优化,会按照你的索引顺序重排你的查询顺序。


    可以查一查 MySQL 的最左前缀匹配原则是什么意思,这里还涉及到联合索引相关的知识点。


    欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持!

1 回复 有任何疑惑可以回复我~
  • 那 a = 1 and b = 2 and c > 3 and d = 4    (a,b,d,c)为什么可以用到全部索引呢?不是遇到 > 就停止匹配索引么。是因为mysql是按照(a b d c)顺序匹配,所以先是判断了 a b d的条件都是等于,最后c的条件是>所以用到了全部索引?
    回复 有任何疑惑可以回复我~ 2019-09-01 00:36:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信