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

时间:2011-12-26 14:30:27

标签: mysql sql database select

我有以下查询:

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等等。我怎样才能让它更快地执行?应如何重写以更好地进行优化?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

尝试使用连接而不是SubQuery它更快:

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

注意:您需要将表名放在最后

答案 2 :(得分:0)

你可以把它变成一个连接

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'来表示您的查询正在发生的事情 - 这将向您展示优化程序如何处理它。