我有一個數據庫,其中我按地理位置列出了事件(當前數據庫中的事件大約爲100000個事件)。目前它處於一個很好的規範化模式中:表tevent
中的事件有一個外鍵fkvenue
,它指向表tvenue
中的一個場所,該外鍵具有外鍵fkcity
,依此類推至tregion
和tcountry
。如何選擇多個表結構以實現最快的查詢響應
找到最活動的國家的查詢因此相當複雜,與不少於三家的內部聯接:
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
令我驚訝的是,這有完全相反的效果:新的查詢花了將近五倍,只要上了年紀,更復雜的查詢。
有人可以解釋這一點,或指出我在一個很好的資源,以幫助我瞭解多表查詢的速度?或者甚至告訴我這種事情的首選模式?
(有人問之前,我小心地做了一個「重置查詢緩存」運行之間,以使時序結果有效,是的,我已經做好索引,一切!!!!)
由於
大衛