1

假设我有一个表单查询:

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

现在查询IN可以返回大量记录。假设这a是主键,那么使用索引是编写此类查询的最佳方式吗?

还是循环遍历子查询返回的每条记录更为理想?

对我来说,很明显,当我做 awhere a = X时,我只是做了一个索引(树)遍历。
但我不确定IN(尤其是在庞大的数据集上)如何遍历/利用索引。

4

2 回答 2

2

MySQL 优化器还没有真正准备好(jet)来正确处理这个你应该将这种查询重写为 iNNER JOIN 并正确索引这将是假设 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 有 PRIMARY 或 UNIQUE 索引

于 2013-08-10T21:21:26.940 回答
0

拥有 1 个查询而不是循环肯定会更有效(并且本质上是一致的,为了获得与循环一致的结果,通常您将不得不使用serializable事务)。人们可以争论支持EXISTSvs IN;据我记得mysql生成(或者至少5.1是这样的)......

利用索引的效率a取决于子查询结果的数量和顺序(假设优化器选择先从子查询中获取结果,然后将其与 进行比较a)。据我了解,最快的选择是执行合并连接,这需要两个结果集按相同的键排序;但是,由于排序顺序不同,这可能是不可能的。然后我猜这是优化器决定是排序还是使用循环连接。您可以依靠它的选择或尝试使用提示,看看它是否有所作为。

于 2013-08-10T21:12:03.893 回答