什么是聚簇索引,什么是非聚簇索引,搜索过程是怎样的

69 阅读3分钟

聚簇索引和非聚簇索引是数据库中常见的两种索引类型。

  1. 聚簇索引(Clustered Index)
    • 聚簇索引是一种特殊的索引,它决定了数据在磁盘上的物理存储顺序。
    • 在聚簇索引中,索引的叶子节点包含了数据行本身,而不仅仅是指向数据行的指针。这意味着索引的顺序就是数据行的顺序。
    • 每个表只能有一个聚簇索引,通常是主键索引。
  2. 非聚簇索引(Non-Clustered Index)
    • 非聚簇索引是一种普通的索引结构,它将索引和实际数据行分开存储。
    • 在非聚簇索引中,索引的叶子节点包含了指向实际数据行的指针,而不是数据行本身。
    • 一个表可以有多个非聚簇索引。

搜索过程在聚簇索引和非聚簇索引中有所不同:

  • 聚簇索引搜索过程

    1. 查询执行时,数据库引擎使用聚簇索引定位到满足查询条件的索引页。
    2. 然后,它在索引页中直接找到相应的数据行,因为索引页本身包含了数据行。
    3. 这个过程通常更快,因为查询过程中直接访问了数据行,而不需要额外的I/O操作。
  • 非聚簇索引搜索过程

    1. 查询执行时,数据库引擎使用非聚簇索引定位到满足查询条件的索引页。
    2. 然后,它从索引页中获取指向实际数据行的指针。
    3. 最后,数据库引擎使用这些指针来访问实际的数据行。
    4. 这个过程可能需要额外的I/O操作,因为在获取实际数据行之前需要访问索引和数据两个地方。

总的来说,聚簇索引通常可以提供更快的查询性能,因为它直接存储数据行,而非聚簇索引需要额外的步骤来获取实际的数据行。

分别是在哪个引擎中使用的

聚簇索引和非聚簇索引在不同的数据库引擎中有不同的使用情况。

  1. 聚簇索引
    • 在MySQL的InnoDB存储引擎中,主键索引就是一个聚簇索引。如果没有显式指定主键,则InnoDB会使用一个隐藏的6字节长的整数列作为隐式主键,然后使用这个主键索引来组织数据存储到磁盘上。
    • 在SQL Server中,主键索引或唯一索引(如果表中有)也通常是聚簇索引。
  2. 非聚簇索引
    • 在MySQL的MyISAM存储引擎中,所有的索引都是非聚簇索引。MyISAM使用一种称为“堆表”的存储方式,数据存储在一个独立的数据文件中,而索引则存储在另一个独立的索引文件中,索引文件中的叶子节点包含的是指向实际数据行的指针。
    • 在InnoDB中,除了主键索引外的其他索引都是非聚簇索引。也就是说,如果你在InnoDB表上创建了非主键索引,则这些索引都是非聚簇索引,它们的叶子节点包含的是指向数据行的指针,而不是数据行本身。

总的来说,在InnoDB中,主键索引是聚簇索引,其他索引是非聚簇索引;而在MyISAM中,所有的索引都是非聚簇索引。