MySQL是为主键创建额外的索引还是将数据本身用作索引

2022-08-11 00:00:00 mysql primary-key

找不到明确的答案。 我知道当您创建主键时,MySQL会根据该主键对数据进行排序,问题是,它实际上是创建了另一个索引,还是使用实际数据作为索引,因为它应该按主键排序?

编辑:

如果我有一个表,具有索引A和索引B,但没有主键,那么我有数据+索引A+索引B。如果我将表更改为将索引A的列作为主键,我将只有数据(它也用作索引)+索引B,对吗?以上是内存使用量


解决方案

Clustered and Secondary Indexes

每个InnoDB表都有一个特殊的索引,称为聚集索引,行的数据存储在其中。通常,聚集索引是主键的同义词。要从查询、插入和其他数据库操作中获得最佳性能,您必须了解InnoDB如何使用聚集索引来优化每个表的最常见的查找和DML操作。

  • 在表上定义主键时,InnoDB会将其用作聚集索引

  • 如果您没有为表定义主键,MySQL将定位所有键列都不为空的第一个唯一索引,并且InnoDB将其用作聚集索引。

  • 如果表没有主键或合适的唯一索引,InnoDB会在包含行ID值的合成列上在内部生成一个名为GEN_CLUST_INDEX的隐藏聚集索引。按照InnoDB分配给此类表中各行的ID进行排序。行ID是一个6字节的字段,随着新行的插入而单调增加。因此,按行ID排序的行实际上是按插入顺序排列的。

聚集索引如何加快查询速度

通过聚集索引访问行很快,因为索引搜索直接指向包含所有行数据的页。如果表很大,则与使用索引记录中的不同页存储行数据的存储组织相比,聚集索引体系结构通常可以节省磁盘I/O操作。

相关文章