认识mysql组合索引的最左匹配原则

关于mysql组合索引的最左匹配原则很多人都理解都是不正确的,那接下来就带你正确的认识它。

为何要使用组合索引呢

  • 效率高,减少查询开销,索引列越多,通过索引筛选出的数据越少
  • 覆盖索引,MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操

最左匹配原则是什么

顾名思义,就是最左优先,在创建组合索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。复合索引很重要的问题是如何安排列的顺序,比如where后面用到c1, c2 这两个字段,那么索引的顺序是(c1,c2)还是(c2,c1)呢,正确的做法是,重复值越少的越放前面,比如一个列 95%的值都不重复,那么一般可以将这个列放最前面。另外,复合索引的字段数尽量不要超过 3个,一旦超过,要慎重考虑必要性。

index(a,b,c)
where a=3    只使用了a
where a=3 and b=5    使用了a,b
where a=3 and b=5 and c=4    使用了a,b,c
where b=3 or where c=4    没有使用索引
where a=3 and c=4    仅使用了a
where a=3 and b>10 and c=7    使用了a,b
where a=3 and b like 'xx%' and c=7    使用了a,b

其实相当于创建了多个索引:key(a)、key(a,b)、key(a,b,c)

到这里就完了?其实还没有,思考:where b=3有没有用的索引?

借助mysql查询优化器explain,我们会发现type=index(这个之前分析过),要想用到这种类型的索引,对这个索引并无特别要求,只要是索引,或者某个联合索引的一部分,mysql都可能会采用index类型的方式扫描。但是呢,缺点是效率不高,mysql会从索引中的第一个数据一个个的查找到最后一个数据,直到找到符合判断条件的某个索引。

参阅资料

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL索引的最左匹配原则是指在使用复合索引进行查询时,必须按照索引的最边的列开始匹配,然后再逐个匹配剩余的列。如果不按照索引的最边的列进行匹配,MySQL将无法利用索引,而需要进行全表扫描,对性能会产生很大的影响。\[1\]\[2\]\[3\] 举个例子,如果有一个由(a, b, c)组成的复合索引,那么在查询时必须先使用a进行过滤,然后才能使用b或c进行过滤,即使b或c也属于索引的一部分。如果不按照这个顺序进行查询,MySQL将无法使用索引进行优化。\[3\] 需要注意的是,最前缀匹配原则只适用于联合索引,而不适用于单列索引。在建立联合索引时,最前缀匹配原则可以帮助我们优化查询性能,提高查询效率。\[2\] #### 引用[.reference_title] - *1* *3* [MySQL最左匹配原则](https://blog.csdn.net/weixin_52060913/article/details/130615245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Mysql 联合索引最左匹配原则](https://blog.csdn.net/Klaus_S/article/details/130972214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值