聚簇索引和非聚簇索引

谁借莪1个温暖的怀抱¢ 2024-03-22 14:47 139阅读 0赞

聚簇索引的简介

  • 索引的分类
  • 聚簇索引 (InnoDB)
  • 非聚簇索引(MyISAM)
  • 查非聚簇索引存在的回表问题
  • 聚簇索引的原理
    • 举例说明
    • 如果没有指定主键
    • 其他引擎
      • MyISAM
    • 其他数据库系统
  • 聚簇索引的优点
  • 聚簇索引逻辑上的连续性
  • 非聚簇索引
  • 聚簇索引与非聚簇索引的区别

索引的分类

MySQL索引根据物理存储的形式,分为聚簇索引和非聚簇索引。

聚簇索引 (InnoDB)

聚簇索引(clustered index),也叫作聚集索引。

数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。

那么这个innodb,他除了这个聚簇索引,像什么复合索引,前缀索引,还有这唯一索引,他们都是在这个聚簇索引的基础之上建立的索引。所以他们也统称为辅助索引

聚簇索引它是一个概念,它默认的实现是这个主键索引。主键索引就是聚簇索引他实现之一,如果你这个表里没有这个主键索引,InnoDB就会选择一个唯一的非空索引代替。
如果连唯一的索引都没有的话,这个InnoDB就会在内部生成一个隐式的聚簇索引。

就是无论怎么样,这个InnoDB都会有一个唯一的聚簇索引。

非聚簇索引(MyISAM)

将数据与索引分开存储,表数据存储顺序与索引顺序无关。

查非聚簇索引存在的回表问题

去查一个非主键索引,然后这个非主键索引最后查询到的东西其实是一个主键。这样的话,你还要根据那个主键去回表,再去查,去查那个主键索引,再去查一遍,这就是它的一个回表的情况。

聚簇索引的原理

InnoDB里只有主键是有聚簇索引的。它根据那个索引直接能查到那个数据的一些信息。因为它那个就是索引段,是直接和数据绑定在一起的。

聚簇索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放了表的行记录数据。

举例说明

先创建一张表:

  1. create table customer(
  2. cust_id INT(10) NOT NULL,
  3. name varchar(16),
  4. phone_no varchar(16),
  5. PRIMARY KEY(`cust_id`) USING BTREE,
  6. ) engine = InnoDB;

插入几条测试数据之后,聚簇索引如图:
在这里插入图片描述
可以看到,聚簇索引的叶子节点包含了整张表的行记录数据。

同B+树数据结构一样,每个数据页都通过一个双向链表来进行来链接。

如果没有指定主键

如果没有明确指定主键或唯一键,它会自动选择一个作为默认索引,其为“隐式聚簇索引”。

需要注意的是,隐式聚簇索引可能并不是最优的选择,因为它可能会选择一个不太适合作为聚簇索引的列。

其他引擎

不是所有数据库引擎都遵循相同的规则来保证每张表都有聚簇索引。之前回答都是基于默认引擎InnoDB所提供的规则。

MyISAM

例如MyISAM并不适用聚簇索引的概念。相反,它使用了一种不同的索引结构,将数据存储在索引文件和数据文件中分开存储。

在这种情况下,每张表都有一个主键索引,但它不是聚簇索引。而是根据主键的值来排序数据,但数据本身不与索引结构绑定。

其他数据库系统

也存在类似的差异。例如PostgreSQL支持多种引擎,其中包括默认的B-tree索引引擎和针对特定用途的其他引擎,如全文搜索引擎和时空索引引擎。

这些引擎可能具有不同的索引实现方式,不一定都会使用聚簇索引。

聚簇索引的优点

通过聚簇索引查找目标数据时理论上比非聚簇索引要快。

因为聚簇索引能够在B+树索引的叶子节点上直接找到数据。

非聚簇索引查找目标数据需要多一次索引查询

此外,由于定义了数据的逻辑顺序,聚簇索引能够特别快地访问一定范围内的数据。

聚簇索引逻辑上的连续性

聚簇索引的存储并不是物理上的连续,而是逻辑上的连续。

数据页之间通过双向链表链接,按照主键的顺序排序。

数据页之内的记录是通过单向链表进行维护的,物理存储上可以同样不按照主键的顺序存储。

非聚簇索引

非聚簇索引(non clustered index),也称为二级索引、辅助索引。

聚簇索引与非聚簇索引的区别

在这里插入图片描述

聚簇索引的叶节点存放表的行记录数据。

非聚簇索引叶节点存的是指针指向对应的数据块

即聚簇索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点

参考资料

  1. 两分钟掌握聚簇索引!
  2. 我来告诉你,MySQL是如何通过【索引】找到一条【真实的数据】

发表评论

表情:
评论列表 (有 0 条评论,139人围观)

还没有评论,来说两句吧...

相关阅读

    相关 索引索引的区别

    聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。聚集索引存储记录是物理上连续存在,物理存储按照索引排序,而非聚集索引是逻辑上的连续,物理存储并不连续,物理存储不按照索

    相关 索引索引的介绍

    聚簇索引和非聚簇索引是数据库中两种不同的索引结构。 聚簇索引是一种基于数据行的索引。它将表中的记录按照指定的列排序,并将这些记录存储在一起形成一个聚簇。聚簇索引只能创建在表的

    相关 索引索引

    1.定义: 不是单独的索引类型,而是一种数据存储方式。 一般建表会用一个自增主键做聚簇索引,没有的话MySQL会默认创建。我们日常工作中,根据实际情况自行添加的索引都是

    相关 MySQL 索引索引

    聚簇索引就是对磁盘上的实际数据重新组织以按照特定的一个或者多个列的值排序的算法 特点是存储数据的顺序和索引顺序一致 一般情况下主键会默认生成聚簇索引 且一张表有且只有一个聚簇

    相关 MySQL:索引索引

    聚簇索引就是对磁盘上的实际数据重新组织以按照特定的一个或者多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致 一般情况下主键会默认生成聚簇索引 且一张表有且只有一个聚簇索