聚簇索引的非叶子节点存储的是索引值,叶子节点存储的是完整的数据记录,一个表只能有一个聚簇索引,一般是表的主键,主要用于范围查询和排序。
      非聚簇索引的非叶子节点存储的也是索引值,但是叶子节点存储的是数据行的主键和对应的索引列,需通过主键才能访问完整的数据行,这就是回表。一个表可以有多个非聚簇索引,非聚簇索引又称为辅助索引,二级索引等,主要用于快速定位要查找的列。

请输入图片描述

为什么聚簇索引查询速度快?

      在 InnoDB 中,聚簇索引指的是按照每张表的主键构建的一种索引方式,它是将表数据按照主键的顺序存储在磁盘的一种方式。这种索引方式保证了行的物理存储顺序与主键的逻辑顺序相同,因此查找聚簇索引的速度非常快。

没有创建主键怎么办?

      数据库记录中除了我们自己定义的字段外,还会添加一些隐藏字段,比如db_row_id,如果我们没有创建主键,会默认选择一个唯一索引作为聚簇索引,如果唯一索引也没有,默认就选择隐藏主键 db_row_id 作为聚簇索引。

回表是什么意思?

      通常我们使用聚簇索引就可以直接查找到数据记录,但是非聚簇索引由于它的叶子节点只存储主键值和索引值,这种情况下我们使用非聚簇索引查询相应的数据记录,需要先查到对应的叶子节点的主键值,然后再用主键值进行一次查询才能获得我们需要的数据记录,这个过程称为回表。

为什么主键查询效率快?

      逐渐索引查询数据记录不需要回表,减少了查询步骤,相应也提升了查询效率。

我们应该如何提升查询效率呢?

      回表会降低查询效率,所以我们应该通过优化索引结构,添加相应的索引以及优化 SQL 语句,减少回表的次数以提升查询的效率,同时我们也可以依赖覆盖索引、索引下推等技术。

什么是索引下推和索引覆盖?

      索引覆盖就是在索引中就包含了我们需要查询的数据列,比如我想查询 column2,此时有一个索引记录(column1,column2),那我们通过索引 column1 进行查询 select column2 from table where column1='test';,上面的情况就是覆盖索引的例子,这种情况就不需要回表进行查询了。
      针对索引下推,首先我们需要了解存储引擎只能根据索引列的值来定位对应的主键值,然后回表获取完整的记录行。如果查询条件中还有其他未在索引中使用的筛选条件,那么这些条件只能在回表获取完整行之后再服务器层进行判断,这就导致了很多不满足条件的记录也进行了回表操作,增加了回表的次数。为了减少回表次数,我们可以利用索引下推技术在存储引擎层使用索引中的列来进行额外的筛选操作,而不仅仅是使用索引来定位记录的主键值。总结来说,索引下推就是联合索引在本身数据就有的情况下,直接通过联合索引再进行一次数据的过滤,而不是通过回表返回到 server 层进行数据的过滤。

      

Last modification:April 26th, 2025 at 05:16 pm
如果觉得我的文章对你有用,请随意赞赏