如果我的表的 PK 是自动递增列,并且我的表有一个仅包含该列的索引,那么与完全没有键/索引相比,对性能的影响是什么?
我很好奇对 MySQL 和 MS SQL 的影响 - 是否存在差异。
更新
为了澄清,我的表还有其他列,但它们都不是键/索引。我现在只关心插入性能。
最佳答案
在带有 InnoDB 的 MySQL 中,如果您未指定 PK 或没有 UK,那么它将自动创建一个隐藏列,该隐藏列与用于表集群的自动增量列非常相似(请参阅 the corresponding documentation )。因此,无论您是否显式定义,都会存在某种带有索引的自动递增列。因此,显式添加一个不会对性能产生负面影响(在这两种情况下,插入都会根据集群索引完成),恰恰相反,如果您查询该列,它是 MySQL 中最快的访问路径。
根据我收集到的有关 MS SQL Server 的信息,它提供了一种非聚集选项,即一种指定表而无需 PK 且无需使用任何索引进行组织的方法。在这种情况下,由于存在附加数据,因此将自动增量列指定为 PK 会产生一定的开销。并且根据您是否指定集群,它必须像MySQL一样根据索引插入数据(集群)或者可以将数据放在最后(非集群)
“Index-Organized Tables and Clustered Indexes”更详细地介绍了各种数据库的此类内容。
关于mysql - 具有自动增量列的插入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24935357/