所以我有两个表具有引用同一对象的ID。其中一个表将其存储为varchar,另一个将其存储为int。我想要子查询(或可能加入)这两个表。
WHERE foo = CAST(bar AS UNSIGNED)
或
WHERE CAST(foo AS CHAR) = bar
哪一个更好?
编辑:这两个ID都没有编入索引。
答案 0 :(得分:1)
这取决于索引。如果两个列都设置了索引,则应转换为int
,因为它只需要比较4个字节。但是,如果仅对varchar
列编制索引,则转换为varchar
。
最后,您应该使用您的查询explain
来查看使用的索引,并进行相应的转换。
如果未设置索引,则转换为int
通常是更好的方法。但是,如果没有索引设置,它并不重要,通过索引比通过选择正确的转换方式节省更多时间。除此之外,表格很小。然后,它也不重要。
事实上,我们不仅要考虑比较成本,还要考虑投射费用:将int
投放到varchar
比将varchar
解析为int
。但是,比较具有至少4个字符的varchar将使该优势无用。如果您的值往往高于999,则转换为int
的速度会更快。但现在这取决于您的操作系统,体系结构,mysql二进制文件使用的指令集等等。获得真正可靠答案的唯一方法是:在目标机器上对这种情况进行基准测试。