我有以下查询:
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等等。我怎样才能让它更快地执行?应如何重写以更好地进行优化?
答案 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'来表示您的查询正在发生的事情 - 这将向您展示优化程序如何处理它。