在MySQL中使用INT和VARCHAR作为主键之间是否存在可测量的性能差异?我想使用VARCHAR作为参考列表的主键(想想美国的州、国家代码),同事不会将INT AUTO_增量作为所有表的主键.

我的论点(详见第here条)是,INT和VARCHAR之间的性能差异可以忽略不计,因 for each INT外键引用都需要一个连接来理解引用,VARCHAR键将直接显示信息.

那么,有没有人对这个特定用例以及与之相关的性能问题有经验?

推荐答案

很明显,通过使用所谓的natural key而不是surrogate key,可以避免一些连接查询.只有您可以判断这在您的应用程序中是否具有重要意义.

也就是说,您可以测量应用程序中最重要的查询,因为它们处理大量数据,或者执行非常频繁.如果这些查询从消除连接中受益,并且使用varchar主键时不会受到影响,那么就这样做.

不要对数据库中的所有表使用这两种策略.在某些情况下,自然密钥可能更好,但在其他情况下,代理密钥更好.

其他人则认为,在实践中,自然密钥很少会发生变化或重复,所以代理密钥通常是值得的.

Mysql相关问答推荐

将具有多个结果的表连接为新列?

在mySQL中使用子查询和WHERE子句的JOIN

MySQL RDS ALTER TABLE ENUM短暂中断了我的数据库连接

如何跨多个产品查找相同时间范围的数据集

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

MySQL:获取连续记录的数量(日期)?

MySQL MDL(元数据锁)为什么会导致死锁?

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

为大表优化 Django 模型

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

SQL - 基本的内部连接查询

SQL: Select TEXT 字段的子字符串比整个值快

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

在 Presto Athena 中将字符串转换为数组

查找同时玩过这两种游戏的玩家

如何判断嵌套查询返回的元组中的每个条目是否相同?

在 MySQL 中为多列创建索引以进行查询优化

SQL 查找边界之间的值

docker-entrypoint-initdb 中的 MySQL 脚本未执行

Mysql:创建表时将DATETIME的格式设置为'DD-MM-YYYY HH:MM:SS'