使用VARCHAR或INT列 - MySQL可以改变性能

时间:2014-01-13 12:02:47

标签: mysql performance integer innodb varchar

我有很多表,有数百万行,有MySQL。这些表用于存储日志行。 我在VARCHAR(50)中有一个字段“country”。此列上有一个索引。 它是否会改变将INTId存储在INT而不是这个国家领域的性能?

谢谢!

2 个答案:

答案 0 :(得分:5)

你的问题比初看起来要复杂一些。简单的答案是Country是一个最多50个字符的字符串。用4字节整数替换它应该减少字段所需的存储空间。较少的存储意味着处理查询和较小索引时的I / O开销较少。当然有异常情况。如果country通常具有NULL值,那么当前存储可能比拥有ID更有效。

但是,当你考虑让这个领域保持最新时,它会变得有点复杂。与参考表的一个区别是,这些国家现在已经标准化,而不是特别的名称。一般来说,这是一件好事。另一方面,各国确实会随着时间的推移而发生变化,所以你必须时不时地加入“南苏丹”或“东帝汶”。

如果您的数据库插入/更新很重,那么更改国家/地区字段需要在参考表中查找正确的值 - 并且可能在那里插入新记录。

我的观点是“gosh ......最初以这种方式设置数据库是个好主意”。此时,您需要了解维护国家/地区参考表对应用程序的影响,以便使数据结构更高效,更准确,从而获得较小的性能提升。

答案 1 :(得分:1)

INT值的索引显示比应用于字符串数据类型(VARCHAR)的索引更好的性能。 因为搜索/匹配整数总是比字符串快,并且索引下面实现的搜索算法的工作原理相同。

在您的情况下,INT类型的索引将比VARCHAR获得更好的性能。