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

Ran*_*ash 12 mysql database database-design foreign-keys relational-database

一个问题:

我有2张桌子:

Product
id INT
name VARCHAR(64)
something TEXT
else INT
entirely BOOL
Run Code Online (Sandbox Code Playgroud)

Ingredient
id INT
name VARCHAR(64)
description TEXT
Run Code Online (Sandbox Code Playgroud)

现在我还有一个链接表

Products_Ingredients
product_id INT
ingredient_id INT
Run Code Online (Sandbox Code Playgroud)

为了我的多对多关系.

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

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

将这些名称用作链接表中的复合键是否是一个好主意?

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

你有什么意见?

Mik*_*ll' 17

当你可以衡量时,意见无关紧要.

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

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

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

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

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

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

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

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