【HBZ分享】MYSQL的联合索引 与 覆盖索引

混淆: 联合索引和覆盖索引是什么关系,二者是一个意思吗?

  1. 二者肯定不是一个意思,并且二者间不存在包含或者强依赖关系,可以认为是两个不同的概念,只是有交集而已。
  2. 联合索引:当创建的所以中包含多个列的时候,比如name, age这两个字段一起作为一个索引列的时候,就是联合索引,就是索引有多个列组成。
  3. 覆盖索引:就是查询的所有字段恰好都包含在索引字段当中,这种的才叫覆盖索引,就是覆盖索引不需要回表查询
  4. 举例1: A索引包含的字段有name, age, sex三个字段,首先A索引肯定叫联合索引,如果【select name, age from person where name=‘hhh’ and age = 18;】 查询字段有name, age, 而这俩字段恰好都包含在联合索引A中,这种的就叫做覆盖索引
  5. 举例2:同样A索引, 如果是【select name, work, descript from person where name=‘hhh’ and age = 18;】, 这种的work和descript字段不在联合索引的字段内,这种的就不叫覆盖索引,要拿着主键id进行回表查询。
  6. 举例3:B索引包含的字段只有name, 首先这个不叫联合索引,因为就一个字段,就是个普通索引,但sql是【select name from person where name=''hbz";】查询字段只有name,恰好索引字段也是name,这种的也叫覆盖索引,但不是联合索引
  7. 以上3个例子就诠释了二者不是强依赖的关系,压根就不是一个意思。

==注意1:使用联合索引的时候,where后面的条件字段那肯定要在联合索引的包含字段之内,并且要遵从最左原则,即条件字段一定要按照联合索引字段的顺序最左为name,则一定要存在name,name可以不是第一个,但一定要有name。比如联合索引顺序是name, age, sex。 那where条件的一定是要存在name字段的【where name = ‘xxx’ and age = xx and sex = ‘男’】,可千万不能是【where age = xx, and sex = “男”】 ==这种把最左边的name不写,那就不生效了

注意2:也可以是【where age = xx and name = “hhh”】数量对不上不要紧,顺序上对不上也没事,优化器会自动调整,但一定要有name字段,因为他是最左边的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值