2011-06-14 24 views
4

我有一個MySql數據庫。我有很多記錄(大約4,000,000,000行),我想處理它們以減少它們(減少到大約1,000,000,000行)。如何管理MySql上的巨大操作

假設我有以下表格:

  • RAWDATA:我有每秒超過5000行,我想將它們插入到RAWDATA

  • ProcessedData:此表是在RawData中插入的行的已處理(聚合)存儲。 最小行數> 20000000

  • ProcessedDataDetail:我寫表ProcessedData(數據是彙總)

    用戶的詳細資料要查看和搜索ProcessedData表中需要加入更多的比其他表。 插入RawData並在ProcessedData中搜索(ProcessedData INNER JOIN ProcessedDataDetail INNER JOIN ...)非常慢。我用了很多索引。假設我的數據長度是1G,但是我的索引長度是4G :)。 (我想獲得這些指標的搭配,它們讓我的工藝變慢)

我該如何提高這個過程的速度?

我想我需要一個影子表從ProcessedData,將其命名爲ProcessedDataShadow。然後處理RawData並將它們與ProcessedDataShadow聚合,然後將結果插入ProcessedDataShadowProcessedData。你有什麼想法??

(我正在用C++開發該項目)

謝謝你提前。

回答

3

不知道更多關於你的實際的應用是什麼,我有以下建議:

  1. 使用InnoDB,如果你是不是已經。 InnoDB利用行鎖,更好地處理併發更新/插入。如果你不同時工作,它會變慢,但行鎖定可能是你必須擁有的,這取決於你對RawData有多少來源。

  2. 索引通常會加快速度,但嚴重選擇的索引會使速度變慢。我不認爲你想擺脫它們,但很多索引可以使插入非常緩慢。在插入批次數據時可以禁用索引,以防止更新每個插入索引。

  3. 如果您將選擇大量可能會干擾數據收集的數據,請考慮使用僅用於讀取的複製的從屬數據庫服務器。即使這會鎖定行/表,主(主)數據庫也不會受到影響,並且只要有空就可以立即恢復。

  4. 您是否需要處理數據庫中的數據?如果可能的話,可能會收集應用程序中的所有數據,並只插入ProcessedData。

+0

非常感謝。但我在插入InnoDB時遇到了問題。爲什麼它慢慢插入記錄? – 2011-06-14 08:47:50

+0

由於併發支持,InnoDB插入比MyISAM慢得多。但是,比較插入到一個表中時,同時連接10個同時連接,InnoDB可能會更快或更快,所以這一切都取決於應用程序。您可以通過同時插入多行來加速進程(也就是說,多個VALUES括號) – jishi 2011-06-14 08:52:28

+2

這也值得一讀:http://tag1consulting.com/InnoDB_Performance_Tuning – jishi 2011-06-14 08:53:42

2

您還沒有說過數據的結構是什麼,它的整合程度如何,用戶需要如何及時提供數據,也沒有說合並過程可能會有多糟糕。

然而,最直接的問題是每秒鐘下行5000行。你將需要一個非常大,非常快的機器(可能是分片羣集)。

如果可能的話,我建議編寫一個合併緩衝區(使用內存中的哈希表 - 不在DBMS中)將合併數據放入 - 即使它只是部分合並 - 然後從此更新到processedData表而不是試圖直接從rawData填充它。實際上,我可能會考慮將原始數據和整合數據分離到單獨的服務器/集羣上(MySQL聯合引擎可以方便地提供數據的統一視圖)。

你分析了你的查詢,看看你真的需要哪些索引? (提示 - this script對此非常有用)。