gpt4 book ai didi

mysql - SQL 性能 : Which is quicker? IN() 与 JOIN

转载 作者:可可西里 更新时间:2023-11-01 07:35:52 26 4
gpt4 key购买 nike

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

谢谢,狮子座

最佳答案

来自 MySql 在线文档,IN() :

IN (value,...)

If all values are constants, they are evaluated according to the type of expr and sorted. The search for the item then is done using a binary search. This means IN is very quick if the IN value list consists entirely of constants. Otherwise, type conversion takes place according to the rules described in Section 11.2, “Type Conversion in Expression Evaluation”, but applied to all the arguments.

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

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

SELECT * 
FROM table t1
WHERE EXISTS
(
SELECT *
FROM temp_table t2
WHERE t1.field = t2.field
)

关于mysql - SQL 性能 : Which is quicker? IN() 与 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7979462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com