我不是很熟悉数据库及其工作原理。从性能的角度(插入/更新/查询),使用字符串作主键是否比整数慢?


当前回答

是的,但除非您希望有数百万行,否则不使用基于字符串的键(因为它较慢)通常是“过早优化”。毕竟,字符串存储为大数字,而数字键通常存储为较小的数字。

不过,要注意的一件事是,如果您在任意键上聚集了索引,并且在索引中进行了大量的非顺序插入。写入的每一行都将导致索引重新写入。如果您正在进行批量插入,这确实会降低过程的速度。

其他回答

不要担心性能,直到您获得了一个简单而合理的设计,该设计与数据描述的主题一致,并且非常适合数据的预期用途。然后,如果出现性能问题,您可以通过调整系统来处理它们。

在这种情况下,使用字符串作为自然的主键几乎总是更好的,只要您可以信任它。如果是字符串也不用担心,只要字符串足够短,比如说最多25个字符。就性能而言,你不会付出很大的代价。

数据输入人员或自动数据源是否总是为假定的自然键提供一个值,还是有时会省略?输入数据偶尔会出错吗?如果是,如何检测和纠正错误?

指定查询的程序员和交互用户能够使用自然键来获得他们想要的东西吗?

如果你不相信天然的钥匙,那就找一个替代品。如果你发明了一个代理,你也可以发明一个整数。然后,您必须考虑是否对用户社区隐藏代理。一些没有隐藏代理键的开发人员后来后悔了。

有可能是一个非常大的误解有关字符串在数据库中。几乎每个人都认为数字的数据库表示比字符串更紧凑。他们认为db-s中的数字表示为内存中的数字。但事实并非如此。在大多数情况下,数字表示法更接近于字符串表示法。

使用数字或字符串的速度更依赖于索引,而不是类型本身。

使用什么作为主键并不重要,只要它是UNIQUE即可。如果您关心速度或良好的数据库设计,请使用int型,除非您计划复制数据,否则请使用GUID。

如果这是一个访问数据库或一些小应用程序,那么谁真的在乎。我认为,我们大多数开发人员之所以把旧的int或guid放在前面,是因为我们有一种方式来发展项目,并且您希望给自己留下发展的选择。

在PK列中使用整数有两个原因:

我们可以为自动递增的整数字段设置标识。 当我们创建pk时,db会创建一个索引(Cluster或Non Cluster),在数据存储到表之前对其进行排序。通过在PK上使用标识,优化器在保存记录之前不需要检查排序顺序。这提高了大表的性能。

默认情况下,ASPNetUserIds是128字符字符串,性能很好。

如果键必须是唯一的在表中,它应该是键。这是为什么;

主字符串键=正确的数据库关系,1个字符串键(主)和1个字符串索引(主)。

另一个选项是一个典型的int Key,但如果字符串必须是唯一的,你仍然可能需要添加一个索引,因为不停的查询来验证或检查它的唯一性。

所以使用int标识键=不正确的DB关系,1 int键(主),1 int索引(主),可能是唯一的字符串索引,手动验证相同的字符串不存在(类似sql检查可能)。

为了在主键上使用int而不是字符串获得更好的性能,当字符串必须是唯一的时,它将不得不是一个非常奇怪的情况。我总是喜欢使用字符串键。根据经验,除非需要,否则不要对数据库进行反规格化。