2011-12-22 105 views
3

我正在尋找處理MySQL中大表的選項。在我的數據庫中,幾乎沒有超過1.3億行(超過70GB)的表增長非常快。爲了報告和分析目的,我必須運行一些聚合函數,儘管有索引,查詢運行速度非常慢。我試圖用合併數據製作一些表格,但這不是最佳的。所以我正在尋找可以用來解決這個問題的工具。非常大的mysql表和報告

+0

什麼方法/方法你用來整合你的數據嗎? – Nonym 2011-12-23 02:13:33

+0

我運行了一些預聚合查詢來填充彙總表 – user1078191 2011-12-23 13:51:33

+0

硬件,存儲引擎,查詢本身,索引 - 所有這些都會影響查詢的速度。您可以運行'EXPLAIN SELECT'來查看MySQL的功能。 70演出是很多數據,但它可以始終進行優化(不同的存儲引擎,規範化,分區) - 由於您沒有發佈進行分析所需的任何信息,因此很難指出問題並提出解決方案除了通常的解決方案 - 比如Nonym的答案。 – 2011-12-23 15:13:25

回答

3

開始通過尋找到partition荷蘭國際集團的表,如果您尚未:

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

http://www.slideshare.net/datacharmer/mysql-partitions-tutorial

http://blog.mayflower.de/archives/353-Is-MySQL-partitioning-useful-for-very-big-real-life-problems.html

你是如何 '整合' 你的數據嗎?也許你使用的方法不是最優的。一種好的方法(讓我知道這實際上是你在做什麼)是創建一個包含聚合數據的表。然後將其設置是這樣的:

首先拋開數據是如何被傾倒到主桌...

  • 創建任務(cron或任何你可以有方便的或已配置),其相對於如何將數據加載到主表中的指定時間間隔運行(我們稱之爲MAIN,前進)。如果您的MAIN表每小時加載一次,則將其同步。半小時?沒關係。無論如何您都可以檢查速度,或者您的報告運行時間接近非高峯時段,然後計劃在

    以上
  • 正確地爲您的表索引合併數據。我們稱之爲AGG

  • 創建一個將數據從MAIN加載到AGG的存儲過程,該存儲過程基本上是AGG LOAD FOR INTERVAL-?。當然,在這裏你是唯一一個知道數據如何或何時插入MAIN的人,所以你也是知道聚集意圖是什麼的人。如果聚合意圖未完成(也就是說它是一整天,所以它是一個累計運行,直到設置爲止),也可以繼續運行聚合存儲過程。

  • 使用STAGING表。 對我來說,他們是最好的

  • 創建一個重新檢查數據的存儲過程,以便通過運行此過程可以在AGG表中反映任何更新或記錄的其他插入操作。包含要更新的範圍的參數。如果它是每天,那麼你有一個DAILY AGG LOADDAILY AGG RELOAD程序。包括一個AGG CHECK INTERVALAGG CHECK DAILY程序,這將有助於你在晚上睡得好。哦,更不用提AGG DATA HOLE CHECKMISSING AGG DATA CHECK和應用實現檢查數據所需要的最小量,你可以從彙總表或從主表或臨時表(最好)

  • 當然獲得業務規則,千萬不要修改AGG表。始終只重新加載它。

  • 這有什麼用?那麼你不需要讓你的報告查詢AGG表,它更小,更快(因爲聚合已經完成)?性能問題可能是在間隔加載時出現的,但是如果您正確地構建表,其索引和維護,它應該是值得的。

  • 分區進來了嗎?存檔。一旦某段時間過去了(討論什麼是你的團隊/老闆/頂級人物可以接受的),你可以從MAIN歸檔舊數據。我經歷過不得不在生產數據庫中保存一年的數據。這種感覺像是一種阻力,但因爲這是客戶的要求,所以公司別無選擇,只能給我所需的磁盤空間(搓手),而男孩則一直陪伴着它,直到我得到一些體面的東西。我必須提到我的經驗是使用Microsoft SQL Server 2005,存儲過程和SSIS使它變得有趣。

這是所有如果你不知道它,併爲其他人可能想考慮的選項。我並不是說你不知道上面的任何一個;我只是說明我以前能夠做的事情 - 考慮到我沒有更多的信息與你的帖子一起工作,除了你有一個合併過程,你嘗試過..

+0

感謝您的建議。我已經嘗試了很多次,可能不是這樣的順序。所以我應該從一個好的計劃開始。 – user1078191 2011-12-23 15:27:40

+0

是的,我應該提到這一點。正確計劃,預測並永遠不要低估(就磁盤空間而言,估計會更好一些)您的要求.. – Nonym 2011-12-24 04:46:38