使用自动递增列插入性能

时间:2014-07-24 13:38:58

标签: mysql sql sql-server

如果我的表有一个PK是一个自动递增列,而我的表有一个只包含该列的索引,那么对于没有键/索引的性能影响是什么?

我很好奇MySQL和MS SQL的影响 - 如果存在差异。

更新

为了澄清,我的表有其他列,但它们都不是键/索引。我现在只关心插入性能。

2 个答案:

答案 0 :(得分:1)

在带有InnoDB的MySQL下,如果你没有指定PK或没有UK,那么它将自动创建一个隐藏列,该列非常类似于用于表的聚类的自动增量列(参见{{3 }})。因此,无论您是否明确定义,都会有某种带索引的自动递增列。因此,在明确添加一个性能时不会对性能产生负面影响(在两种情况下都将根据聚簇索引进行插入),恰恰相反,如果您在该列上进行查询,则它是MySQL中最快的访问路径。

从我收集的关于MS SQL Server的内容中,它提供了一个非聚集选项,即一种指定没有PK的表并且不使用任何索引进行组织的方法。在这种情况下,将自动增量列指定为PK会产生一定的开销,因为还有其他数据。根据您是否指定了群集,它必须根据索引插入数据作为MySQL(群集)或者只是将数据放在末尾(非群集)

" the corresponding documentation"详细介绍了各种数据库的内容。

答案 1 :(得分:0)

索引是一种分页表中包含的数据的方法。把它们想象成标有A-Z的电话簿中的书签,你想要找到一个名字以'G'开头的人。如果你不得不用眼睛扫描整个电话簿,你会发现使用书签跳转到G更加快捷和高效。

索引就像这样

SELECT * FROM [TABLE]
WHERE [COLUMN1] = 'G'

如果没有索引,SQL Engine将搜索整个表并消除不符合WHERE条件的每一行。使用索引,SQL查询优化器将仅查找具有相应搜索条件的行。你可能会在更大的桌子上发现这一点。