自然键vs代理键是一个innodb外键

时间:2011-11-01 19:11:44

标签: mysql database database-design foreign-keys relational-database

一个问题:

我有两张桌子:

Product
id INT
name VARCHAR(64)
something TEXT
else INT
entirely BOOL

Ingredient
id INT
name VARCHAR(64)
description TEXT

现在我还有一个链接表

Products_Ingredients
product_id INT
ingredient_id INT

我的多对多关系。

现在产品和配料都有独特的名称。所以我可以使用名称作为自然键...但这是一个好主意吗?

说我有产品:Paint Thinner Supreme 成分:Butylonitrotetrocycline

在链接表中使用这些名称作为复合键是不是一个好主意?

尽管我理解在代理人之上使用自然键背后的想法,但我还是不能不再认为使用简单整数作为主键(和外键)会更快。 MySQL服务器消化这些不同密钥的方式会有区别吗?

您有什么看法?

2 个答案:

答案 0 :(得分:17)

当您可以衡量时,意见无关紧要。

我使用自然键和代理项在PostgreSQL上实现了这一点。我使用了300,000种产品,180种成分,并填充了两种“产品成分”表,每种产品含有3到17种成分,100,000种随机选择的产品(1053462行)。

使用自然键选择单个产品的所有成分,返回0.067毫秒。使用代理,0.199ms。

使用在0.145毫秒内返回的自然键返回单个产品的所有非id列。使用代理,0.222 ms

因此,自然键在此数据集上的速度提高了约2至3倍。

自然键不需要任何连接来返回此数据。代理键需要两个连接。

实际的性能差异取决于表的宽度,行数,页面大小和名称长度等。代理键的开始优于自然键,但很少有人试图测量它。

当我为我的雇主的操作数据库设计数据库时,我构建了一个带有围绕自然键设计的表的测试平台,以及围绕id编号设计的表。这两种模式都有超过1300万行计算机生成的样本数据。在少数情况下,对id号架构的查询优于自然键架构50%。 (因此,使用自然密钥,使用id号花费20秒的复杂查询需要30秒。)但是,80%的测试查询对自然密钥模式具有更快的SELECT性能。有时它的速度要快得多 - 相差30到1。

我们希望自然键在未来几年内在我们的数据库中胜过代理人。 (除非我们将某些表格移到SSD上,否则自然键可能会永远超越代理人。)

答案 1 :(得分:3)

对于这种情况,我优先考虑代理键,因为

  1. 产品或成分的名称可能会发生变化,特别是如果您的内容是用户生成的(例如拼写错误或项目有多个可能的名称)
  2. 你的自然键会比自然键长得多,因此效率会降低