2012-07-25 73 views
0

在页面上我有一个查询,这是使页面加载速度下降。查询优化,而不是在

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

USERS1是与网站,大量数据的所有用户表。 USERS2是以下eachother用户的表格。

所以,我需要选择一些用户,这不是跟随下面。

任何优化方法?

我张贴真正的查询:上user_id领域

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; 

指标。

查询花费0.0912秒

此查询的工作不是用更少的数据测试服务器上的坏,但它需要长达3秒的活之一。

+1

了解[SQL连接(http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of -sql-joins.html);并确保你在'user_id'列上有索引。 – eggyal 2012-07-25 12:21:05

回答

0

这应该做的伎俩:

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

'WHERE NOT IN ...' – eggyal 2012-07-25 12:22:55

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

+1

出于好奇:你能否引用为什么这应该是MySQL中反连接的更快实现?在更复杂的数据库(例如Oracle)中,由于有效的查询转换,我不认为会有相关的性能差异... – 2012-07-25 12:26:58

+0

@LukasEder:同意。 [Quassnoi的分析](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)达到了同样的结论。 – eggyal 2012-07-25 12:28:07

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

出于好奇:您能否引用为什么这应该是MySQL中反连接的更快实现?在更复杂的数据库(例如Oracle)中,由于有效的查询转换,我不认为会有相关的性能差异... – 2012-07-25 12:26:48

+0

从什么时候起,MySQL是一个复杂的数据库? :)这些查询可能会也可能不会更快。 OP鼓励使用/解释'EXPLAIN'命令。 – biziclop 2012-07-25 12:28:00

+1

@LukasEder:同意。 [Quassnoi的分析](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)达到了同样的结论。 – eggyal 2012-07-25 12:28:17