使用IN()时主索引不起作用吗?

时间:2015-04-06 21:18:39

标签: mysql indexing subquery

SELECT 
  i.id 
FROM 
  itable i
WHERE 
  i.id IN (
    SELECT 
      itable_id j 
    FROM 
      ijoin j 
    WHERE 
      j.user_id = '1'
  )

此查询检查itable上的每一行,大约300万。 由于i.id是PRIMARY KEY,它不应该仅仅获取这些项吗?

如何优化此查询?

1 个答案:

答案 0 :(得分:2)

MySQL在优化此类查询方面非常糟糕。它不是在子查询中选择少量值并使用它们索引到主表中,而是迭代主查询中的所有行,并使用它们索引到子查询中的表。

如果您使用JOIN

,效果会更好
SELECT DISTINCT i.id
FROM itable i
JOIN ijoin j ON i.id = j.itable_id
WHERE j.user_id = '1'