繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM