使用 IN() 时主索引是否不起作用?
Does primary index not work when using IN()?
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,它不应该只获取这些项目吗?
如何优化此查询?
MySQL 在优化此类查询方面出了名的差。它不是选择子查询中的少量值并使用它们索引到主 table,而是遍历主查询中的所有行并使用它们索引到子查询中的 table .
如果使用 JOIN
:
会更好
SELECT DISTINCT i.id
FROM itable i
JOIN ijoin j ON i.id = j.itable_id
WHERE j.user_id = '1'
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,它不应该只获取这些项目吗?
如何优化此查询?
MySQL 在优化此类查询方面出了名的差。它不是选择子查询中的少量值并使用它们索引到主 table,而是遍历主查询中的所有行并使用它们索引到子查询中的 table .
如果使用 JOIN
:
SELECT DISTINCT i.id
FROM itable i
JOIN ijoin j ON i.id = j.itable_id
WHERE j.user_id = '1'