您的当前位置:首页正文

索引覆盖与回表

2024-11-29 来源:个人技术集锦

上回书说到:什么情况下,索引下推没办法提高sql查询效率?

info
主键id
名称name
value
别名realname

对于info表,我们现在有(name,value)联合索引

显而易见的是,不使用索引下推的话,将导致如果需要查询realname这一列,那么我们就需要先根据一个索引查询,然后回表一次,然后再根据另一个索引寻找符合的数据。

解决方案很简单,索引数据是存储在索引树的节点上的,所以是不需要进行回表查询,那么两种解决方案,第一种,不查询realname不就可以了,第二种把realname添加一个索引就可以了,这就是索引覆盖。

索引覆盖,顾名思义,用索引覆盖你需要查找的值。

常用的mysql数据库的索引使用的是B+树,建立一个索引,就是建一个B+树,而普通索引和聚簇索引的区别就在于,叶子节点存储的数据不同,普通索引存储的是主键,而聚簇索引的叶子节点存储的是行数据,

索引执行顺序:先搜索普通索引树,找到符合条件的叶子节点(主键),然后去聚簇索引拿到对应的行数据。这个也就是回表。

当我们查询的数据都是索引的话,就可以不用回表去查询聚簇索引对应的行记录,这样就大大提升了查询效率。

创建主键的时候自动给主键添加了索引,且该索引为唯一性索引

这句话经常听到,可是还是那句老话,不谈场景的技术,都是瞎扯,就比如我们建立表结构时,用的不是单一主键,而是联合主键,那么这个时候有几个索引哪(滑稽保命)?建立的索引是不是聚簇索引哪(滑稽保命)?

学习使我快乐,问题使我进步

显示全文