【问题标题】:How much does performance change with a VARCHAR or INT column - MySQLVARCHAR 或 INT 列的性能变化有多大 - MySQL
【发布时间】:2014-01-13 12:02:46
【问题描述】:

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

谢谢!

【问题讨论】:

  • 一个 int 总是 1 个字节。 varchar 是 numchars+1 个字节。所以是的,它会对速度产生巨大影响
  • @user1281385:int 不仅仅是 1 个字节。这将使其范围仅从 0 到 256。但通常是 4 个字节。
  • @juergend 哎呀,好地方。答案仍然存在
  • 要考虑的另一点是,国家有时会更改名称 - 这意味着外国会以新名称 - 缅甸 -> 缅甸来承认这些国家。

标签: mysql performance integer innodb varchar


【解决方案1】:

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

但是,当您考虑使该字段保持最新时,它会变得有点复杂。与参考表的一个不同之处在于,国家现在是标准化的,而不是临时名称。总的来说,这是一件好事。另一方面,国家确实会随着时间而变化,因此您必须准备不时添加“南苏丹”或“东帝汶”。

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

我的意见是“天哪……一开始就以这种方式设置数据库是个好主意”。此时,您需要了解维护国家参考表对应用程序的影响,以使数据结构更高效、更准确,从而获得微小的性能提升。

【讨论】:

  • 是的,我知道对维护以及磁盘空间的所有影响。我主要只关心性能!我想我会改变一切,即使这需要一点时间。即使性能增益很小,但它仍然是一些东西!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多