Mysql:在这种情况下,为什么WHERE IN比JOIN快得多?

时间:2016-09-29 15:02:35

标签: mysql performance

我在mysql(InnoDB)的WHERE IN子句中有一个长列表(> 2000 ids)的查询:

SELECT id 
FROM table 
WHERE user_id IN ('list of >2000 ids')

我试图通过使用INNER JOIN而不是像这样的(使用id和user_id使用索引)来优化它:

SELECT table.id 
FROM table 
INNER JOIN users ON table.user_id = users.id WHERE users.type = 1

然而,令人惊讶的是,第一个查询要快得多(按因子5到6)。为什么会这样?当where in子句中的id数量变得更大时,第二个查询是否优于第一个查询?

2 个答案:

答案 0 :(得分:0)

这不是您的问题的答案,但您可以使用其替代第一个查询,您可以通过将IN条款替换为EXISTS来更好地提高效果,因为EXISTS性能优于IN {1}}参考: Here

SELECT id 
FROM table t
WHERE EXISTS (SELECT 1 FROM USERS WHERE t.user_id = users.id)

答案 1 :(得分:0)

这是两个查询之间的不公平比较。

  • 在第一个查询中,您提供了一个常量列表作为搜索条件,因此MySQL必须打开并仅搜索表和/或1个索引文件。

  • 在第二个查询中,您指示MySQL从另一个表动态获取列表,并将该列表连接回主表。如果索引用于创建连接或需要全表扫描,也不清楚。

要进行公平比较,请将用于获取第一个查询中的列表的查询与查询本身一起计时。或者尝试

SELECT table.id FROM table WHERE user_id IN (SELECT users.id FROM users WHERE users.type = 1)

以上内容在子查询中动态获取id列表。