【问题标题】:In MySQL, is it faster to compare with integer or string of integer?在 MySQL 中,与整数或整数字符串进行比较是否更快?
【发布时间】:2021-10-13 23:37:29
【问题描述】:

我有一张很大的桌子,看起来像这样

int_id       str_id
  1             1
  1             1
  2             2
  3             3
 ...           ...
99999         99999
  3             3

int_id 的类型为INT,而列str_id 的类型为VARCHAR。它们总是包含“相同”的值(即,如果 int_id 是 1,那么 str_id 是“1”,等等......)。

现在假设我要查询 id 在(1,4,5,2,....5282,55,232) 中的行(大约 15 个 id 的列表),下面的 2 个查询中哪个更快?

select * from table where int_id IN (1,4,5,2,....5282,55,232)

select * from table where str_id IN ('1','4','5','2',....'5282','55','232')

假设我为每一列创建一个索引。我的桌子绝对是巨大的,速度对我来说非常重要,所以我想尽可能地优化它。感谢任何帮助。

【问题讨论】:

  • 理论上 int_id 应该更快,但我非常怀疑你会注意到差异。没有多余的 str_id 列可以通过允许更多的表行放入更少的空间来提高您的性能。
  • “绝对巨大”有多大?你一次选择了多少个ID?
  • 整数应该稍微快一些,但是如果表大小是一个问题,您应该完全删除冗余的 VARCHAR str_id。它完全没有任何目的;如果您需要int_id 的字符串表示,您可以在需要时简单地转换它。 (另外,使用int_id 意味着您不必担心在IN 语句中输入所有' 字符,这是一个主要好处——它可以为列表中的每个ID 节省两次击键。)此外, int_id 可以是自动增量列,str_id 不能,整数列将始终正确排序,而字符串则不能。
  • @ysth:OP 不是已经用 (大约 15 个 id 的列表) 说他们一次选择了多少个 ID?
  • str_id 列违反了 3NF。删除它。

标签: mysql


【解决方案1】:

MySQL 最终会在某个处理器上运行,通常整数比较可以在单个 CPU 周期内完成,而字符串比较通常需要多个周期,可能每个字符一个周期。请参阅Why is integer comparison faster then string comparison? 了解更多信息。

【讨论】:

  • 但是,获取行并提取列进行测试是 99% 的工作量。因此,加快比较速度可能不会产生明显的差异。
  • @RickJames 同意索引之类的事情可能比 OP 提出的问题更重要。
【解决方案2】:
  • 对于表扫描,获取行并提取列进行测试是 99% 的工作量。因此,加快比较速度可能不会产生明显的差异。

  • 在索引列的情况下,问题实际上是查找 INT 与 VARCHAR 相比有多快。同样,获取行(在索引的 BTree 中)是性能的压倒性决定因素。在讨论索引的 BTree 时,我可能不得不猜测 98%。

底线:使用适合您的应用程序的数据类型;不用担心 INT 与 VARCHAR 的性能

(警告:我凭空捏造了“99%”和“98%”。)

指向 C++ 代码的链接大多无关紧要,因为它只讨论单个比较,而不是获取行、解析行、钻取 BTree 等。

哦,另外一件事,既然你说的是 5 位数字,你可以通过将 INT(4 字节)更改为 MEDIUMINT UNSIGNED(3 字节)来获得另一个微小的性能提升.

哦,这个问题甚至还有一个硬件组件。 INT(及其兄弟)可以存储字节“big-endian”或“little-endian”。 MySQL 在第一天就标准化了其中一种用于存储在磁盘上的方法。现在,当他们在一些硬件平台上获取数字时,他们必须反转字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2015-05-28
    • 2011-06-21
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多