比较2个表,找不到现有的“id”

时间:2011-02-09 19:37:59

标签: sql mysql

比较两个表时遇到速度问题。 假设我有以下表格。

表A 14,000条记录

name(varchar),join_id(int)

表b 54,209条记录

second_name,join_id(int)

现在我希望找到表A中存在的行,但不希望查找由joint_id连接的B中的行 随机排序(有点)

我尝试了以下内容:

 SELECT a.name , b.second_name 
    FROM a
    LEFT OUTER JOIN b ON a.joint_id = b.joint_id
    WHERE b.joint_id IS NULL
    LIMIT 0,10

查询花了很长时间并弄乱了服务器,所以我的问题是;

有没有更快的方法来实现这一目标?

编辑:我删除了RAND(),否则可以解决此问题。  但我仍然有同样的问题。 我将尝试下面的建议,看看我是否可以改善查询时间。

2 个答案:

答案 0 :(得分:3)

注意我给你的第二列固定值为NULL,因为当b不存在时,b.second_name =>空值。该问题的症结ORDER BY RAND()需要完整扫描才能对每条记录放置一个rand()。你无法避免表扫描。

SELECT a.name , NULL AS second_name 
FROM a
WHERE NOT EXISTS (Select * from b WHERE a.joint_id = b.joint_id)
ORDER BY RAND() 
LIMIT 0,10;

假设您在表a上有ID,则可以通过不必拖动表a中的所有列来加快速度。 http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

SELECT a.name , NULL AS second_name 
FROM a
WHERE a.ID in (
    select id from a
    WHERE NOT EXISTS (Select * from b WHERE a.joint_id = b.joint_id)
    ORDER BY RAND()
    LIMIT 0,10)

答案 1 :(得分:2)

b.second_name不会在所有行中显示为NULL吗?

除了检查索引使用(使用EXPLAIN)之外,您还可以检查此版本:

SELECT a.name 
    FROM a
    WHERE a.joint_id NOT IN ( SELECT b.joint_id
                                FROM b 
                            )
    ORDER BY RAND() 
    LIMIT 0,10

警告:如果b.joint_id具有NOT NULL属性,则NOT IN的行为类似于其他写入的NOT EXISTS示例。

如果b.joint_id可以为Nullable,请不要使用此答案。它会给出错误的结果。