我在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数量变得更大时,第二个查询是否优于第一个查询?
答案 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列表。