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是主键,因此它不应该仅获取那些项吗?

如何优化此查询?

最佳答案

众所周知,MySQL在优化此类查询方面很差。而不是在子查询中选择少量的值并使用它们索引到主表中,而是迭代遍历主查询中的所有行,并使用它们在子查询中索引到表中。

如果使用JOIN会更好:

SELECT DISTINCT i.id
FROM itable i
JOIN ijoin j ON i.id = j.itable_id
WHERE j.user_id = '1'

关于mysql - 使用IN()时主索引不起作用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29479869/

10-12 03:08