2011-06-30 18 views
0

我有一個數據庫,其中我按地理位置列出了事件(當前數據庫中的事件大約爲100000個事件)。目前它處於一個很好的規範化模式中:表tevent中的事件有一個外鍵fkvenue,它指向表tvenue中的一個場所,該外鍵具有外鍵fkcity,依此類推至tregiontcountry如何選擇多個表結構以實現最快的查詢響應

找到最活動的國家的查詢因此相當複雜,與不少於三家的內部聯接:
select r.fkcountry,count(distinct e.id) from tevent e inner join tvenue v on e.fkvenue=v.id inner join tcity cy on v.fkcity=cy.id inner join tregion r on cy.fkregion=r.id group by r.fkcountry order by count(distinct e.id) desc

我試圖找到超速事情的方式,而且我認爲這可能有助於按國家直接映射事件。我創建了一個映射表teventcountry,用下面的更簡單的語法產生:
select ec.fkcountry,count(distinct e.id) from tevent e inner join teventcountry ec on ec.fkevent=e.id group by ec.fkcountry order by count(distinct e.id) desc

令我驚訝的是,這有完全相反的效果:新的查詢花了將近五倍,只要上了年紀,更復雜的查詢。

有人可以解釋這一點,或指出我在一個很好的資源,以幫助我瞭解多表查詢的速度?或者甚至告訴我這種事情的首選模式?

(有人問之前,我小心地做了一個「重置查詢緩存」運行之間,以使時序結果有效,是的,我已經做好索引,一切!!!!)

由於

大衛

回答

0

你需要看看MySQL是如何評估的查詢。爲此,請使用內置命令EXPLAIN,該命令描述MySQL如何執行給定的select語句。

這裏是參考EXPLAIN:http://dev.mysql.com/doc/refman/5.5/en/explain.html

您可以使用EXPLAIN的輸出看到MySQL的「查詢執行計劃」,其中包括索引和聯接它將使用,等等。從這裏你可以解釋爲什麼給定的查詢快或慢,以及你可以做些什麼來改進它。通常這意味着添加一個特定的索引,或者調整一個索引,以便在查詢中使用它。

你可以谷歌「MySQL解釋」一堆使用這個強大的工具指南。這裏有一個這樣的步驟:http://forums.spry.com/howtos/1345-using-mysqls-explain-command.html