2011-12-27 115 views
0

我有一个查询从四个不同的表中获取信息,并将它们全部加入。这些表格是'公会','行会会员','公寓'和'用户'。查询我有工作,但我只是想知道它的效率,如果它可以做得更快。MySQL查询优化(使用COUNT和JOIN)

我的意思是,目前它工作正常,速度很快,但guilds_memberships内部没有太多数据,它是COUNTED()'d。我正在使用的查询如下所示。 (总是会有至少1记录guilds_memberships,单位和用户内部的每个行会顺便说一句,如果要与所有优化(无理由来检查空值)帮助)

SELECT g.id, g.roomid, g.ownerid, g.roomid, g.state, g.name, g.description, g.badgestring, g.primarycolour, g.secondarycolour, g.created, u.username, f.FlatName, COUNT(m.guildid) AS Members 
FROM guilds g 
INNER JOIN users u ON u.id = g.ownerid 
INNER JOIN flats f ON f.FlatID = g.roomid 
INNER JOIN guilds_memberships m ON m.guildid = g.id 
WHERE g.id =1 
LIMIT 0 , 30 

回答

1

嗯,我不要以为你可以做些什么来大大提高这个查询的性能。它看起来不错,甚至表现很好。

但是,如果它开始表现较差大,这里有步骤,我会做:

  1. 打破份该查询。在一个查询中检索公会信息,在另一个查询中检索用户信息等。让应用程序代码进行加入。

  2. 缓存什么是可缓存的。我敢打赌,u.usernamef.FlatName不会经常更改,因此您可以加载它们一次并保留在内存(或memcached)中。

这些更改的目的是为了减轻数据库的负载。应用程序服务器(通常)很小,只需启动更多的工作人员。另一方面,数据库是最难扩展的组件之一。

+0

感谢您的快速回答。 u.username永远不会改变,公会不能交换,只能被删除。因此,在一个公会的存在中,u.username总是相同的,尽管f.FlatName是可以改变的,但你说的很对,它很少会被改变。 我会记住你对使用memcache所说的话。未来可能证明有用。 – DominicEU 2011-12-27 16:52:42