2010-09-06 58 views
1

我在MySQL數據庫中有一個2000萬記錄表。 SELECT的工作非常快,因爲我建立了良好的索引,但是INSERT和UPDATE操作變得非常慢。數據庫是重負載下的Web應用程序的後端。 INSERT和UPDATE非常慢,因爲這個表上有5個索引,索引大小現在大約爲1GB - 我想這需要很多時間來計算。Granules選擇數據庫表分區?

爲了解決這個問題,我決定對錶格進行分區。我運行MySQL 4,不能升級(不能直接控制服務器),所以我會做手動分區 - 爲每個分區創建一個單獨的表。

數據集由大約18000個不同的邏輯片組成,可以完全分開查詢。因此,我可以創建18000個名爲(maindata1,maindata2等)的表。但是,我不確定這是最佳的方式嗎?除了顯而易見的事實,即當我想手動執行某些操作時,我將不得不瀏覽管理工具中的18000個項目,因此我擔心文件系統性能。文件系統是ext3。我不知道在36000個文件(有數據文件和索引文件)的目錄中查找文件速度有多快。

如果這是一個問題,我可以將一些數據切片連接到一個表中。例如:maindata10,maindata20等maindata10將包含切片1,2,3 ... 10。如果我去參加10人的「團體」,我只會有1800張桌子。如果我想組20,我會得到900張桌子。

我想知道這個分組的最佳大小,即一個目錄中的文件數量與表大小?

編輯:我也想知道是否使用多個單獨的數據庫將文件組合在一起是一個好主意。因此,即使我有18000個表格,我也可以將它們分組在30個數據庫中,每個表格有600個表格。看起來這將更容易管理。我不知道是否有多個數據庫會增加或減少性能或內存佔用(儘管這會使備份和恢復複雜化)

回答

1

有幾種策略可以提高性能。通過「分區」,我假設你的意思是「具有相同列布局但不同數據內容的表版本」。

獲取將運行MySQL 5的服務器,如果可能的話。它在這個東西上更快更好,足以讓你升級後沒有問題。

你在使用InnoDB嗎?如果是這樣,你能切換到myISAM嗎? (如果您需要嚴格的事務完整性,您可能無法切換)。

對於分區,您可能會試圖找出哪種數據切片組合會給您大致相同大小的分區(按行計數)。如果我是你,除非你能向自己證明你需要,否則我不會超過20個分區。

如果只有幾個數據切片正在積極更新(例如,如果他們是「這個月的數據」和「上個月的數據),我可能會考慮拆分那些成更小的片段。例如,你可能有「本週的數據」,「上週的」和「前一週」,然後,當你的分區冷靜下來時,複製他們的數據並將它們組合成更大的組合,比如「前一個季度」。缺點是它需要例行的星期天晚上的樣式維護工作才能運行,但它的優點是大部分或全部更新只發生在桌面的一小部分上。

+0

是的,表結構相同,但數據不同。我正在使用myISAM。 – 2010-09-06 17:17:59

1

如果您使用myISAM,您應該查看合併引擎,這樣您可以獲得與分區mysql5幾乎相同的功能,您將能夠運行與現在運行相同的select。