聚集索引是否与MySQL中的实际数据分开创建和存储,如果是,那么为什么我们不能拥有多个聚簇索引。我们需要做的就是创建另一个索引并将其存储在内存中。
答案 0 :(得分:2)
聚簇索引至少部分是表的物理排序和存储方式,即磁盘上的行顺序。这就是为什么你只能拥有一个。但是因为它反映了行的物理布局,所以它可能比典型的索引更紧凑和更高效。
更新: 正如@RickJames在下面指出的那样,在InnoDB(自5.5.5以来MySQL的默认引擎)中,查找通常是一个两阶段的过程。一个b树将二级密钥与主密钥相关联,第二个b树将主密钥与数据记录的位置相关联。如果在主键上检索数据,则只需要第二次查找。从这个意义上讲,总是需要进行b树查找。
另外,根据MySQL文档:
通常,聚簇索引与主键同义。 1
它被认为是“群集”而不仅仅是主键的原因是因为InnoDB尝试根据主键对数据记录进行排序,并为将来的记录留出空间以便将其插入其数据页中的正确位置{{3 }}
因此,对InnoDB主键的查询不仅比二级索引少一个b树查找,而且由于磁盘上数据的物理排序,主键b-tree可以显着缩小。
即使有一种机制可以使二级索引直接指向数据记录(如索引MyISAM),它仍然有理由,它的性能不如InnoDB的主/聚簇索引。
因此,它基本上是主键的(至少部分)数据记录的物理排序,这会阻止您从二级索引获得相同的性能。
答案 1 :(得分:1)
MySQL的InnoDB为其PRIMARY KEY
执行以下操作:数据记录采用PK顺序,一起存储在B + Tree结构中。这允许快速点查询和范围扫描。也就是说,'底部的值为'树的所有列都有。
InnoDB的辅助键也在B +树中,但底部值是PK列。因此,需要第二次查找以通过辅助密钥获取行。
请注意,辅助密钥可以包含表的所有列,因此就像第二个聚簇索引一样。缺点是对表的任何修改都必然涉及对两个BTree的更改。
相反,MyISAM将数据抛出到一个文件(.MYD)中,并且在.MYI文件中将每个索引都放在自己的BTree中。每个BTree的底部是.MYD中的指针(行号或字节偏移)。 PK的实现方式与辅助密钥没有任何不同。(注意:FULLTEXT
和SPATIAL
索引不在上述讨论范围内。)