SQL性能:哪个更快? IN()与JOIN

时间:2011-11-02 11:18:31

标签: mysql sql performance join database-performance

这是一个我从未得到明确答案的问题。我在这个例子中使用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的内部工作原理以及这个问题的正确答案是什么?

谢谢, 利奥

2 个答案:

答案 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)

正确的答案取决于很多事情。

你已经完成了这项工作 - 如果你的基准测试告诉你使用临时表的速度更快,那么就是这样。

如果您更改硬件或显着改变架构,请记住再次进行基准测试。