聚簇索引和非聚簇索引区别
聚簇索引 (Clustered Index)
-
物理排序:聚簇索引决定了表中数据行的物理排序。因为数据行与索引的排序方式是相同的,所以一个表只能有一个聚簇索引。
-
存储方式:在聚簇索引中,索引本身包含了数据,这意味着索引和数据都存储在一起。你可以将其想象为一个电话簿,其中人们按姓氏排序,且在每个姓氏旁边都有相关的详细信息。
-
性能:由于数据与索引的物理顺序相同,范围查找和大部分查询在聚簇索引上非常快。
-
InnoDB存储引擎:在MySQL的InnoDB存储引擎中,主键索引是聚簇索引。如果没有明确定义主键,则InnoDB会选择一个合适的唯一索引作为聚簇索引;如果没有合适的唯一索引,InnoDB会生成一个隐藏的聚簇索引。
非聚簇索引 (Non-Clustered Index)
-
物理排序:非聚簇索引与表数据的物理存储独立。它有自己的排序,而与数据表的物理排序无关。
-
存储方式:非聚簇索引包含索引的键值和一个指针,指向与该键值相关的数据行。你可以将其想象为书的目录:目录列出了每个主题的页码(指针),但目录中的排序与书中的内容排序不一定相同。
-
性能:对于非聚簇索引,数据库可能需要首先查找索引以获取数据行的地址,然后再次查找以获取实际的数据行。这被称为“双重查找”,可能会比聚簇索引查找稍慢。
-
数量:一个表可以有多个非聚簇索引。
总结
-
选择聚簇索引:由于每个表只能有一个聚簇索引,选择哪个列或列组合作为聚簇索引是非常重要的。通常,这会是主键,但在某些情况下,可能会选择其他列。
-
非聚簇索引的使用:根据查询的需求,为经常用于WHERE子句、JOIN操作和ORDER BY子句的列创建非聚簇索引。
-
存储考虑:在选择索引类型时,还应考虑物理存储的影响。例如,聚簇索引的插入速度可能会受到物理排序的影响,而非聚簇索引的插入速度可能较快,但查找可能需要额外的步骤。