2010-02-12 228 views
13

使用字符串作为主键而不是bigint等的性能损失是多少?字符串比较比整数比较昂贵得多,但另一方面,我可以想象在内部DBMS将计算散列键以减少惩罚。字符串作为主键的性能损失?

我工作的应用程序使用字符串作为几个表(MySQL)中的主键。改变这一点并不是微不足道的,我想知道什么可以获得性能明智的工作证明。

+0

重复的行数,字符串键的平均尺寸,其连接表的查询,? http://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database – 2010-02-12 10:05:19

回答

4

,另一方面我可以想像, 内部数据库管理系统将计算哈希 键,以减少损失。

的DB需要保持B树(或类似结构)与在道路上的关键,让他们有序。

如果密钥散列并将其存储在B树,这将是罚款,以快速检查关键的独特 - 键仍然可以有效地抬起头来。但是,由于B树不再根据字符串值进行排序,因此您无法高效搜索数据的范围(例如使用LIKE)。

所以我觉得最DB真的存储在B树中,字符串可以(1)采取更空间比数值和(2)要求B树是重新平衡如果钥匙以任意顺序插入(没有像数字pk一样增加值的概念)。

处罚在实践的范围可以从微不足道到庞大。这一切都依赖于使用等

1

它取决于几个因素:RDBMS,涉及这些列的索引数量,但总的来说,使用整数将会更高效,并由bigint提供。

任何性能增益取决于使用情况,因此如果没有表格模式和查询工作负载的具体示例,很难说。

除非在域中有意义(我认为独特的东西像社会安全号码),否则代理整数密钥是一个不错的选择;当引用对象改变时,引用对象不需要更新其FK引用。

3

在我们的产品中,我们使用varchar(32)作为主键(GUID),我们没有遇到这方面的性能问题。我们的产品是一个极端过载的网站,对稳定至关重要。 我们使用SQL Server 2005.

编辑:在我们最大的表中,我们有超过3 000 000条记录,其中有大量的插入和选择。我认为一般来说,迁移到整数关键字的好处会很低,但迁移的问题很高。

+1

在SQL Server中的GUID类型。此外,它是理想的复制。 – Timmy 2010-02-12 13:14:23

1

有一点需要注意的是页面拆分(我知道这可能发生在SQL Server中 - 可能在MySQL中也是如此)。

主键在物理上是有序的。通过使用自动递增整数,您可以保证每次插入时都会向下插入下一个数字,因此不需要对数据库重新排序键。但是,如果使用字符串,则可能需要将插入的pk放在其他键的中间以维护pk顺序。重新排序插件上的pks的过程可能会变得昂贵。