是使用超过一个巨大的数据集是一个好主意?(Is using an IN over a huge da

2019-09-30 06:19发布

比方说,我有以下形式的查询:

SELECT a, b, c, d 
FROM table1 
WHERE a IN (
  SELECT x 
  FROM table2 
  WHERE some_condition);

现在的查询IN可以返回的记录数量巨大。 假设a是主键,所以使用索引这是写这样的查询的最佳方式?

或者,它是在每个子查询返回的记录更优化的循环?

对我来说,很清楚,当我做了where a = X很显然,我只是做一个索引(树)遍历。
但我不知道如何的IN (尤其是在一个巨大的数据集)将遍历/利用索引。

Answer 1:

MySQL优化是不是真的准备好了(喷气)正确处理这个你应该这种查询重写到内连接和索引正确,这将是禁食方法假设t1.a和t2.x是独一无二的

这样的事情。

SELECT 
a
, b
, c
, d
FROM 
  table1 as t1
INNER JOIN
  table2 as t2
ON t1.a = t2.x
WHERE 
 t1.some_condition .... 

并确保t1.a和t2.x有主键或唯一索引



Answer 2:

有1个查询,而不是循环肯定会有更有效的(和性质相符,以获得与环一般你将不得不使用一致的结果serializable交易)。 人们可以有利于争论EXISTS VS IN ; 据我记得MySQL的产生(或至少它提供了最多5.1是真的)......

利用上索引的效率a取决于数目和顺序子查询结果(假定优化的动产首先抓住从子查询结果,然后将其与比较a )。 在我的理解中,最快的选项是进行合并连接需要有相同键排序结果集两者; 然而,它可能不是可能的,因为不同的排序顺序。 然后,我想这是优化决策是否进行排序或使用循环联接。 你可以依靠自己的选择或尝试使用提示,看看它是否有差别。



文章来源: Is using an IN over a huge data set a good idea?