【发布时间】: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