2011-12-27 156 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