查询优化,不是IN

时间:2012-07-25 12:19:34

标签: mysql query-optimization

在页面上,我有一个查询,这会降低页面加载速度。

SELECT * FROM users1 WHERE user_id NOT IN (SELECT user_id FROM users2)

USERS1是包含该网站所有用户的表格,包含大量数据。 USERS2是跟随其他用户的表格。

所以,我需要选择一些用户,这些用户并不是很好的。

任何优化方式?

我发布了真正的查询:

SELECT users.*
FROM (
    SELECT user_id
    FROM users
    WHERE user_id!=156 AND user_id NOT IN (
        SELECT follower_id
        FROM following
        WHERE user_id=156
    ) ORDER BY RAND() LIMIT 2
) AS temp
JOIN users ON users.user_id = temp.user_id;

user_id字段的索引。

查询耗时0.0912秒

此查询在具有较少数据的测试服务器上运行不错,但在实时查询上最多需要3秒。

3 个答案:

答案 0 :(得分:2)

LEFT JOIN方式:

SELECT *
FROM users1
LEFT JOIN users2 ON users1.user_id = users2.user_id
WHERE users2.user_id IS NULL

NOT EXISTS方式:

SELECT *
FROM users1
WHERE NOT EXISTS (SELECT 1 FROM users2 WHERE users1.user_id = users2.user_id)

工作示例:http://sqlfiddle.com/#!2/611f2/1

答案 1 :(得分:1)

您应该使用LEFT JOIN以获得最佳效果:

SELECT a.* 
FROM users1 a
     LEFT JOIN users2 b
        ON a.user_id = b.user_id
WHERE b.user_id IS NULL;

另请查看Visual explanation of joins

答案 2 :(得分:0)

这应该可以解决问题:

SELECT users1.* FROM users1
LEFT JOIN users2 on users1.user_id=users2.user_id
WHERE users2.user_id IS NULL