如何使用嵌套SELECT优化此SQL查询?

问题描述:

我有以下查询:如何使用嵌套SELECT优化此SQL查询?

SELECT src_big, created, modified, owner, aid, caption 
FROM photo 
WHERE aid IN (SELECT aid, modified FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me() or uid2 = me())order by modified desc) 
ORDER BY created DESC 
LIMIT 30 

它运行很慢,我因为肯定嵌套查询的等我怎样才能让这个执行更快?应该如何重写以更好地优化?

尝试使用联接,而不是子查询的是速度更快:

SELECT photo.src_big, photo.created, photo.modified, photo.owner, photo.aid, 
photo.caption FROM photo 
inner join album on album.aid = photo.aid 
inner join friend on album.owner = friend.uid2 
WHERE uid1=me() or uid2 = me() 
order by modified desc,created DESC LIMIT 30 

注意:你需要把表名在年底

+0

我唯一的桌子是专辑和朋友正确吗?我应该如何把它们放在最后? – 2011-12-26 14:50:01

我们在我们的Facebook游戏中有几个实例需要这种功能,而且我们有很多问题。在mySQL中,似乎外层查询的每一行都会重新运行嵌套查询,它将重新运行嵌套在其中的查询,从而使其非常缓慢。我们发现将内部查询的结果返回给php,将它连接起来,然后用编译列表运行下一个查询的速度非常快。不确定是否有完全在mySQL中的解决方案,但这种解决方案对我们来说工作得很好。

另一个潜在的问题可能是索引编制,您需要确保您正在搜索或排序的所有列都已正确编入索引。使用mySQLs查询中的解释功能也有助于发现问题。

你可以把它加入

select (stuff) from photo join album 
on photo.aid = album.aid join friend 
on album.owner = friend.uid2 
where friend.uid1 = me() or friend.uid2 = me() 
order by created desc limit 30 

但请注意:由于您正在使用存储的函数,因此它将永远不会进入查询缓存。

通过使用'desc'进行预处理,可以看到发生了什么事情 - 这将向您展示优化器如何处理它。