独特的varchar字段与独特的bigint的MySQL性能

aha*_*son 11 mysql database-design

我正在开发一个应用程序,它将实现十六进制值作为业务键(除了自动增量字段作为主键),类似于Gmail中看到的URL ID.我将为列添加一个唯一约束,并且最初考虑将值存储为bigint以远离搜索varchar字段,但是想知道如果该字段是唯一的,那是否必要.

内部联接将使用自动增量字段完成,十六进制值将在where子句中用于过滤.

简单地将值存储为varchar(x),或者将char(x)存储在进行十六进制转换以及将数值存储为数据库中的整数的附加工作中会产生什么样的性能影响?是否值得增加复杂性?

我对少量行(50k)进行了快速测试,搜索结果时间也相似.如果存在大的性能问题,它会是线性的还是指数的?

我正在使用InnoDB作为引擎.

God*_*eke 5

你的十六进制值是GUID吗?虽然我过去担心像索引这样长项的性能,但我发现在现代数据库中,甚至数百万条记录的性能差异都相当微不足道.

一个可能更大的问题是索引消耗的内存(例如,16字节对比4字节int),但在我控制的服务器上,我可以为此分配.只要索引可以在内存中,我发现其他操作有更多的开销,索引元素的大小不会产生明显的差异.

从好的方面来说,如果你使用GUID,你可以获得所创建记录的服务器独立性,并且可以更灵活地合并多个服务器上的数据(这是我关心的,因为我们的系统聚合来自子系统的数据).

这篇文章中有一个图表似乎支持了我的怀疑:神话,GUID与自动增量