关于MySQL组合索引

比如一个SQL的where条件如下

WHERE `a`, `b`
WHERE `a`, `b`, `c`
WHERE `a`, `b`, `d`
WHERE `a`, `b`, `c`, `d`
WHERE `a`, `c`
WHERE `a`, `c`, `d`

此时创建组合索引 a, b, c, d 能否覆盖全部 where 查询,或怎样设置索引为最优?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

抛开实际场景的问题是没有意义的,但就你给出的问题看,以我经验,我会建立a,ba,c这两个索引,这是最精简了,当然,如果你的数据表,实际中,你不能通过a,b索引排除掉大量数据的话,这时候你就要考虑,为c或者d一起建立索引了。

1个月前 评论
Adachi (楼主) 1个月前
忆往昔弹指间 (作者) 1个月前
Adachi (楼主) 1个月前
Adachi (楼主) 1个月前
Adachi (楼主) 1个月前
讨论数量: 4

WHERE a, c c 用不到索引

WHERE a, c, d c d 用不到索引

1个月前 评论

组合索引有最左原则,所以a, b, c, d不能覆盖a,c和a,c,d和a,b,d查询,如何要所有查询都命中索引,可以创建a,b,c,d和a,c,d和a,b,d三个组合索引

1个月前 评论

没必要所有字段都命中,像‘status’这种就没必要,索引前后顺序的话,要根据a,b,c 三个字段的数据复杂度来决定。

1个月前 评论
Adachi (楼主) 1个月前

抛开实际场景的问题是没有意义的,但就你给出的问题看,以我经验,我会建立a,ba,c这两个索引,这是最精简了,当然,如果你的数据表,实际中,你不能通过a,b索引排除掉大量数据的话,这时候你就要考虑,为c或者d一起建立索引了。

1个月前 评论
Adachi (楼主) 1个月前
忆往昔弹指间 (作者) 1个月前
Adachi (楼主) 1个月前
Adachi (楼主) 1个月前
Adachi (楼主) 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!