[英]How can I optimize this SQL query with JOINS and nested SELECT?
[英]How can I optimize this SQL query with nested SELECT's?
我有以下查询:
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等等。我怎样才能让它更快地执行? 应如何重写以更好地优化?
我们在Facebook游戏中有几个实例,这些功能是必需的,我们遇到了很多问题。 在mySQL中,似乎外部查询的每一行都将重新运行嵌套查询,这将重新运行嵌套查询,使其非常慢。 我们发现将内部查询的结果返回给php,连接它然后用编译列表运行下一个查询的速度非常快。 不确定它是否完全在mySQL中有解决方案,但这个解决方案对我们来说非常有效。
另一个潜在的问题可能是索引,您需要确保正在搜索或排序的所有列都已正确编入索引。 在查询中使用mySQLs Explain函数也有助于发现问题。
尝试使用连接而不是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
注意:您需要将表名放在最后
你可以把它变成一个联接
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'来表示您的查询正在发生的事情 - 这将向您展示优化程序如何处理它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.