优化查询:在选择中选择

时间:2011-10-26 12:33:31

标签: mysql sql select query-optimization

假设我有一个表来存储每个用户的博客(表名是博客)。 但是还有一个表来存储用户喜欢的其他用户的博客(表名是likesBlogs),是吗?

所以要检索它们我只是这样做: - 选择用户的博客。 - 添加他喜欢的博客。

    $q = mysql_query("
SELECT id 
FROM blogs 
WHERE (iduser = $id) 
      OR id IN 
       (SELECT idblog 
        FROM likedBlogs 
        WHERE iduser='$id') 
      AND (id > 0) 
ORDER BY id DESC 
LIMIT 20
") or die(mysql_error());

我可以做得更好吗? (你如何在这个查询中表现出色?)

由于

4 个答案:

答案 0 :(得分:2)

我相信你可以更好地重构它使用EXISTS而不是IN。

IN要求返回整个结果集,然后开始搜索值,但EXISTS逐行检查并在第一次出现时中断内部查询。

SELECT id  
FROM blogs  
WHERE (iduser = $id)        
OR EXISTS
      (SELECT idblog         
       FROM likedBlogs          
       WHERE iduser='$id' AND idblog = id)
AND (id > 0)  
ORDER BY id 
DESC  LIMIT 20 

请参阅Optimizing IN/=ANY Subqueries

  

非常有用的优化是“通知”唯一的子查询   感兴趣的行是内部表达式inner_expr所在的行   等于outer_expr。这是通过推下一个合适的   等于子查询的WHERE子句。也就是说,比较是   转换为:EXISTS(SELECT 1 FROM ... WHERE subquery_where AND   outer_expr = inner_expr)

答案 1 :(得分:2)

通常您会使用join而不是嵌套的select

select blogs.id
from blogs inner join likedBlogs on (blogs.iduser = likedBlogs.iduser and blogs.id  = likedBlogs.idblog)
where blogs.iduser = $id
and blogs.id > 0
order by blogs.id desc limit 20

upd 我第一次没有正确阅读任务声明

select blogs.id 
from blogs left join likedBlogs on (blogs.id = likedBlogs.idblog)
where blogs.iduser = $id or likedBlogs.iduser = $id;

答案 2 :(得分:0)

您的查询对我来说很好。为了提高性能,您应该确保在数据库表的id列上有索引。

答案 3 :(得分:0)

我认为你可能会更好地为工会服务

SELECT id 
FROM blogs 
WHERE iduser = $id AND id > 0
UNION 
SELECT idblog AS id 
FROM likedBlogs 
WHERE iduser='$id' AND idblog > 0