MySQL-索引-覆盖索引

覆盖索引

1.什么是覆盖索引

概念:查询语句中所需要的列在索引中,这样查询结果在索引的数据结构中查找即可拿到结果。

附加网友解释:

  • 解释一: 就是select的数据列从索引中就能够获取,不必从数据表中再次读取,换句话说,就是查询列可以索引福噶
  • 解释二:索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。
  • 解释三:是非聚集组合索引的一种形式,它包括在查询里的select,join和where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。
2.形成覆盖索引的条件

索引分为多种类型,从数据结构上分为 二叉树、红黑树、 Hash索引、B-Tree索引,B+Tree(MySQL使用的存储结构)

索引的实现可以使用多种数据结构,这里使用B-Tree和B+Tree的索引能实现覆盖索引。

3.如何查看是否使用了覆盖索引?

使用 explain命令,通过查看 Extra 列可以看到Using index 的信息,证明使用了覆盖索引

4.如何使用覆盖索引优化SQL

先扯出来一个概念

回表:先索引扫描,再通过ID去查表数据,取索引中未能提供的数据,即为回表。

简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作

如何避免回表?

条件允许的情况下,使用联合索引

  • 使用explain 命令,Extra 列出现Using index condition 表示使用的索引方式为二级检索,数据将会被回表查询,会出现一定的性能消耗。
  • 分页查询时,通过组合索引,能够实现覆盖索引.
5.总结

对于覆盖索引,通过联合索引可能实现覆盖索引,但是该情况只限于对于所需的查询列比较少的情况,所需的查询列比较多的情况,不可能全部实现联合索引,所以不能实现覆盖索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值