2014-10-03 43 views
-1

我有一張大桌子。使用big-table-join優化查詢

我們稱之爲'獨角獸'。

和第二表「農民」。

結構:

農民

  • ID
  • ...更多領域

獨角獸

  • ID
  • farmer_id
  • ...更多領域

而且有查詢:

SELECT 
    f.id, 
    f.name, 
    COUNT(*) 
FROM 
    farmers f 
LEFT JOIN unicorns u 
ON u.farmer_id = f.id 
GROUP BY f.id 

當然表是真名叫不是這樣的,有更多的領域等等。但在我的例子中,我只留下了最重要的東西。

問題是系統增長,並且有太多獨角獸。百萬。

而這個查詢(就像這個)在農民列表頁面上執行。

頁面加載速度並不像以前那麼快,因爲我們每次加載頁面時都會加入數百萬個表格。

問題是:

  • 我們真的需要顯示每個農民的獨角獸列表中的計數。
  • 我們需要提高頁面加載速度。

如果你需要優化這個,你會如何實現這個結果?

你會推薦什麼?

P.S.

就我個人而言,我認爲我需要從主查詢中排除大表連接,分別計算獨角獸數量並將它們存儲在高速緩存存儲器中,重新計算它們。也許有最好的辦法,所以我想聽聽別人的意見。

+0

都是'id'字段'PRIMARY KEY's,你有'unicorns.farmer_id'上的索引嗎? – TheWolf 2014-10-03 10:45:47

+0

是的,我知道主鍵,外鍵和索引 – 2014-10-03 10:48:24

+0

您是否嘗試過直接執行查詢(使用phpmyadmin,shell,...)來檢查執行時間,並確保它真的是這個查詢減慢頁面加載? – TheWolf 2014-10-03 10:50:52

回答

2

我只是在NumberUnicorns農民的桌子上有一個額外的列,並將其存儲在那裏。然後,通過一些數據庫觸發器,當記錄被添加到獨角獸表中時,它只是用來自新記錄的相應計數更新農民表。如果刪除獨角獸記錄,請考慮更新計數。然後,您的查詢立即從農民表完成。

+0

謝謝。經過一番思考和研究後,我決定你的方法是最好的。 – 2014-10-06 09:16:02