0

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

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 秒。

4

3 回答 3

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

于 2012-07-25T12:23:02.513 回答
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;

也看看联接的视觉解释

于 2012-07-25T12:22:31.560 回答
0

这应该可以解决问题:

SELECT users1.* FROM users1
LEFT JOIN users2 on users1.user_id=users2.user_id
WHERE users2.user_id IS NULL
于 2012-07-25T12:22:28.453 回答