这是一个我从未得到确切答案的问题。我在这个例子中使用MySQL。SQL性能:哪个更快? IN()与JOIN
给定一组相当大的值(可以说500)。它是更快地使用这些值与在寻找一个表()子句:
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的内部工作原理以及这个问题的正确答案是什么?
感谢, 利奥
请发布您的基准,以便对它们进行验证。你有领域的索引吗? –
你知道答案很大程度上取决于数据库的结构吗?创建临时表,填充它并加入表涉及大量的CPU工作,与使用带有IN运算符的查询相反。由于内存存储IO会更快,但是InnoDB也可以将其工作数据集保存在内存中。如果你根据InnoDB表的主键进行'IN'搜索 - 它会胜过临时表。 –
如果你也发布了解释计划,这将会很有趣。 –