2011-12-07 82 views
1

我有數據拆分到幾個mysql表中以防止數據重複,但是當我真的去服務數據時加入它們太慢了。因此,我構建了一個更小的緩存表,這個緩存表很可能在不久的將來需要使用(某些數據只與一個小時間幀有關,所以整個表約爲700,000行,但緩存約爲6000)。
構建此緩存在複製到實際緩存表之前使用臨時表,以便在每晚建立表時,實時緩存表不會停止。有時高速緩存表會在大約30分鐘內建成,但有時會卡住並永遠無法完成。在流程列表中,它只是說Copying to tmp table,但如果我放過它,它會旋轉幾天。當複製到Tmp時Mysql太慢表

我該怎麼做才能防止陷入Copying to tmp table?我看了看周圍和無處在線,我可以找到一個非常明確的答案是什麼導致這個除了一些信息here我試圖遵循,但無濟於事。

我認爲可能有更好的方式來建立表格而不是解決內存問題,因爲最終表格在行中很小(儘管每行很大)。構建查詢的一般形式,使緩存表是

Select col1,col2,col3... FROM tbl1 INNER JOIN tbl2 on ... INNER JOIN tbl3 on ... 
    LEFT JOIN (SELECT col4, col5, col6... FROM tbl4 INNER JOIN tbl5 on ...) 
    AS tbl6 on ... WHERE col2 > NOW() ORDER BY col3, col4 

,因爲我想擁有的數據的副本內選擇,如果它存在加入需要的左側,但不希望被限制它如果沒有。
對不起,如果這不夠具體,但如果任何人有任何想法如何防止Copying to tmp table我將不勝感激。

+0

MySQL能夠以極高的速度完美地連接數百萬行的大型表格。你可以發佈你的模式並解釋你的查詢計劃嗎? –

回答

0

你在桌子上設置了索引嗎?您在連接中使用的列上的索引將加快選擇查詢。 你在這種情況下,也許更好的解決辦法是物化視圖:http://fromdual.com/mysql-materialized-views

+0

我已經確定有一些索引正在獲取連接(除了可能的內部select語句,因爲這是動態完成的),但我正在閱讀關於物化視圖的權利。 – hackartist

+0

所以,似乎mysql並沒有真正的物化視圖支持,並且實現它們,你只是在計算事物並記住它們,以便在查詢時不必計算它們...對於這個查詢,我可以在我去的時候並沒有記住它,緩存表的構建是物化視圖刷新步驟...我錯過了什麼嗎? – hackartist

+0

好了現在我看到當yu使用mysql的「觸發器」的時候,實體化視圖稍微多一點,但不幸的是,這對我的應用程序來說不起作用,因爲連接是需要做的基本計算,以保持這個最新的那個連接就是我想象中的所有時間 – hackartist

0

據我瞭解,MYSQL優化的主要原則有兩個極點(除了外鍵的可能性)的

  • 優化尺寸;
  • 優化速度。

不採取字面來理解,foolowing規則描述的MySQL優化:

更大的數據量,更好的是性能,反之亦然。

在類似的情況下,我們創建了一個聚合表作爲一個真正的表,不緩存,而不是臨時表。這樣可以減少計算量並且可以節省MYSQL爲您的查詢執行時間。然後簡化查詢,清除JOIN,GROUP BY包含SELECT,各種函數等。數據最大限度地減少並且事先進行最低限度更新(單獨的查詢或Cron任務)。

創建索引還可以縮小規模並提高速度。通常在索引中包含來自典型查詢的列名稱。