这是一个我从未得到明确答案的问题。我在这个例子中使用MySQL。
给出一组相当大的值(比方说500)。使用带有IN()子句的这些值搜索表是否更快:
SELECT * FROM table WHERE field IN(values)
或者通过在内存中创建一个临时表,用值填充它并将其连接到正在搜索的表:
CREATE TEMPORARY TABLE `temp_table` (`field` varchar(255) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO temp_table VALUES (values)
SELECT * FROM table t1 JOIN temp_table t2 ON t1.field = t2.field
两种方法都会产生相同的结果集。
我已经完成了一些自己的基本基准测试,并发现当处理超过500个值时,使用临时表比使用IN()子句更快。
有人可以向我解释MySQL的内部工作原理以及这个问题的正确答案是什么?
谢谢, 利奥
答案 0 :(得分:2)
来自MySql在线文档,IN():
IN(value,...)
如果所有值都是常量,则根据expr的类型对其进行评估并进行排序。 然后使用二分搜索完成对项目的搜索。这意味着 如果IN值列表完全由常量组成,则IN非常快。 否则,根据规则进行类型转换 第11.2节“表达式评估中的类型转换”中描述的, 但适用于所有论点。
考虑到我认为将IN()与一组常量一起使用是有意义的,否则你应该在另一个表上使用子查询。
当从其他表中检索项目时,您可以考虑使用EXISTS()而不是JOIN,对于大型数据集来说,它会明显更快
SELECT *
FROM table t1
WHERE EXISTS
(
SELECT *
FROM temp_table t2
WHERE t1.field = t2.field
)
答案 1 :(得分:1)
正确的答案取决于很多事情。
你已经完成了这项工作 - 如果你的基准测试告诉你使用临时表的速度更快,那么就是这样。
如果您更改硬件或显着改变架构,请记住再次进行基准测试。