2011-06-27 38 views
2

我們有一個名爲posts_content的mysql表。Mysql'分區'vs將數據分割成不同的表

的結構如下:

CREATE TABLE IF NOT EXISTS `posts_content` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `post_id` int(11) NOT NULL, 
    `forum_id` int(11) NOT NULL, 
    `content` longtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=79850 ; 

的問題是,該表越來越漂亮巨大。許多千兆字節的數據(我們有一個爬行引擎)。

我們每天都會在表格中插入數據,但我們很少檢索數據。現在,桌子變得非常大,難以處理桌子。

我們討論了兩種可能性

  1. 使用MySQL的分區功能使用forum_id(大約有50 forum_ids所以就約50分區的分區表。需要注意的是,即使做出這樣最終會成長每個分區再次數據的多千兆字節甚至最終需要自己的驅動
  2. 創建每個forum_id單獨的表和分裂這樣的數據。

我希望我已經解釋清楚的問題。我需要知道的是,從長遠來看,上述兩種方案中的哪一種會是更好的解決方案。什麼是adv。 dis adv。這兩種情況。

感謝你

+0

我得到了問題,但你提出的解決方案,看起來與我一樣,除了在一個MySQL提供的解決方案和情況2似乎你會建立自己的。我說得對嗎? –

+0

Ozair Kafray - 有些差異,有些我知道。例如,當您使用分區時,您以與以前相同的方式查詢表,但對於最終用戶而言,它仍然是一個表,儘管它分爲許多文件。作爲另一種解決方案,如果您需要查詢數據,您需要首先將所有表放回到連接或臨時表中或類似的東西中。有了你永遠不知道的任何功能...... Darhazer發佈的鏈接很有趣 –

回答

3

不同的是,在第一種情況下,你離開的MySQL做分片,並在第二種情況下,你這樣做是你自己的。 MySQL不會掃描任何不包含數據的碎片,但是如果您有查詢WHERE forum_id IN(...)它可能需要掃描幾個碎片。據我所知,在這種情況下,操作是同步的,例如, MySQL每次查詢一個分區,你可能想要異步實現它。一般來說,如果你自己進行分區,你會更靈活,但是對於基於forum_id的簡單分區,如果一次只查詢1個forum_id,MySQL分區是可以的。

我的建議是閱讀有關分區的MySQL文檔,尤其是restrictions and limitations部分,然後再決定。

+0

好吧,這可能是一個愚蠢的。我讀過mysql分區不支持外鍵。這是否意味着我無法根據上表中的forum_id進行分區?如果沒有,那麼我如何根據forum_id進行分區?我無法理解關鍵字,散列等。另外文檔說,你不能在子分區中使用範圍。這是否意味着我將無法再分配我的數據?或者我可以使用散列post_id subpartition? –

+0

該文檔說明您不能使用外鍵約束。這是因爲MySQL需要搜索每個分區的匹配值,以確保該值存在。如果您自己對錶進行分區,那麼您將無法使用外鍵,也會引用分區表,但可以在表中使用外鍵。但是在分片應用程序和一般的NoSQL中,一致性主要由應用程序管理,而不是由數據庫服務器管理。 –

+0

'FOREIGN KEY''不是必需的。只要確保有合適的索引來替代它們即可。 –

0

3x空間縮小(可能是加速)的快速解決方案是壓縮content並將其放入MEDIUMBLOB。在客戶端進行壓縮,而不是服務器;這節省了帶寬,並允許您在您擁有(或將擁有)的許多客戶端服務器之間分配計算。

「分片」是將數據分離到多個服務器上。見MariaDB和Spider。這允許尺寸增長和可能的性能縮放。如果最終分片,forum_id可能是最好的。但是,這假定沒有論壇太大,不適合一臺服務器。

「分區」分割數據,但只在一臺服務器中分割;它似乎沒有爲您的用例帶來任何好處。由forum_id分區將不會提供任何性能。

刪除FOREIGN KEYs;調試你的應用程序。