4

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

谢谢,狮子座

4

2 回答 2

2

来自 MySql 在线文档,IN()

输入(值,...)

如果所有值都是常量,则根据 expr 的类型对它们进行评估并排序。然后使用二进制搜索完成对项目的搜索。这意味着如果 IN 值列表完全由常量组成,则 IN 非常快。否则,类型转换将根据第 11.2 节“表达式求值中的类型转换”中描述的规则进行,但适用于所有参数。

考虑到我认为将 IN() 与一组常量一起使用是有意义的,否则您应该在另一个表上使用子查询。

当从其他表中检索项目时,您可以考虑使用EXISTS()而不是 JOIN,对于大型数据集,它会明显更快

SELECT * 
FROM table t1 
WHERE EXISTS 
      (
        SELECT * 
        FROM temp_table t2 
        WHERE t1.field = t2.field
      )
于 2011-11-02T11:26:02.267 回答
1

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

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

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

于 2011-11-02T11:30:28.183 回答