2011-01-28 66 views
0

我必須在我的項目的某個地方加入3個表格。
這裏是例如表和列:比連接3張桌子更好的方法是什麼?

Table-1 : posts 
Columns1: id,owner,title,post,keywords 

Table-2 : sites 
Columns2: id,name,url 

Table-3 : views 
Columns3: id,post,view 

當我加入所有這些表它發生這樣的小巨大的查詢:

SELECT title,post,keywords,name,url,view 
FROM posts 
LEFT JOIN sites ON sites.id=posts.owner 
LEFT JOIN views ON views.post = post.id 
WHERE posts.date BETWEEN '2010-10-10 00:00:00' AND '2010-11-11 00:00:00' 
ORDER BY views.view DESC 
LIMIT 0,10 

是它的唯一途徑我也可以做別的事情來獲得更好的性能?

這是我當前查詢的EXPLAIN。以上只是一個例子。 MysqlFront EXPLAIN Result

+0

請發佈`explain`輸出以檢查您的索引是否正確使用 – tobyodavies 2011-01-28 00:40:58

+0

'views'是否保持簡單計數?或者每個帖子的每個視圖都有單獨的條目? – 2011-01-28 00:44:29

+0

我不確定「它發生這樣一個小小的查詢」是什麼意思。很多結果?查詢緩慢? SQL本身比您預期的要大?和「一個很大的疑問」?這是什麼?小或巨大? ;) – siride 2011-01-28 00:54:04

回答

0

如果您的關係得到保證,換句話說不可空的外鍵,那麼如果查詢使用內連接而不是左連接,則查詢會更好。儘管此查詢似乎不夠大或不夠複雜,不足以嚴重影響性能問題。

2

這不是一個特別的「巨大」查詢。你運行了查詢分析器並檢查了哪裏的慢點,然後檢查了你的索引?

回覆:分析器 - 微軟一直在移動它,但在2008年的Management Studio中有幾個選項可以顯示執行計劃。一旦你看到執行計劃,你可以看到問題出在哪裏。尋找採取80%以上的時間並專注於此的單一行動。像表掃描這樣的事情表明你可以通過調整索引來加速它。 (索引也存在缺點,但後來擔心)。

2

這不是一個任何想象力的巨大查詢。

它真的有多慢?

也許如果視圖不包含比您所顯示的更多的信息,那麼您應該只將視圖數量視爲帖子的一個字段。除非實際存儲一些關於視圖本身的信息,例如用戶代理字符串或時間,否則無需將它作爲自己的單獨表格。

0

如果您的POSTS表格特別大(> 100K行?),那麼您可以做的一件事是將時間過濾的帖子加載到臨時表中並加入該臨時表中。

相關問題