比较两个表时遇到速度问题。 假设我有以下表格。
表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(),否则可以解决此问题。 但我仍然有同样的问题。 我将尝试下面的建议,看看我是否可以改善查询时间。
答案 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,请不要使用此答案。它会给出错误的结果。