你的問題是關於「分佈式」,但我看到更多的問題需要先回答。
「高度索引的5TB」會慢慢爬行。索引是BTree。向索引添加新行意味着在該項所屬的樹中定位塊,然後讀取 - 修改 - 寫入該塊。但...
如果索引AUTO_INCREMENT
或TIMESTAMP
(或類似的東西),則該塊被修改是「總是」在B樹的「結束」。所以幾乎所有的讀寫操作都是可緩存的。也就是說,更新這樣一個索引的開銷非常低。
如果索引是「隨機的」,例如UUID,GUID,md5等,則更新的塊是很少在緩存中找到。也就是說,爲這一行更新這一個索引可能會花費一對IOP。即使使用SSD,您也可能無法跟上。 (假設你沒有幾個TB的內存)。
如果索引位於連續和隨機(比如某種「名稱」)之間,那麼可能有數千個「熱點」在BTree,這些可能是可緩存的。
底線:如果你不能避免隨機索引,你的項目是註定的。
下一個問題...查詢。如果您需要掃描5TB作爲SELECT
,那將需要時間。如果這是數據倉庫類型的應用程序,並且需要(比如說)彙總上個月的數據,那麼構建和維護彙總表將非常重要。此外,這可以避免需要「事實」表上的一些索引,從而可能消除我對索引的關注。
「查看歷史數據」 - 查看單個行?或者只看彙總信息? (同樣,如果它像DW一樣,很少需要看到舊的數據點。)如果彙總就足夠了,那麼大多數25TB都可以避免。
你有一臺25TB的在線機器嗎?如果沒有,那可能會迫使你擁有多臺機器。但是接下來你會遇到在他們之間運行查詢的複雜性。
5TB從INT = 4個字節等估計出來?如果使用InnoDB,則需要2到3的倍數以獲得實際的佔用空間。此外,如果您將來需要修改表,則此操作可能需要將表複製過來,以便將所需的磁盤空間加倍。你的25TB變得更像100TB的存儲空間。
PARTITIONing
已經很少有有效的使用情況,所以我不想討論,直到知道更多。
「分片」(跨機器分裂)可能是你的「分佈式」的意思。對於多個表格,您需要認真思考如何分割數據,以便JOINs
將繼續工作。我們可以縮小它的範圍 - 使用更小的數據類型,規範化等等。但是不要「過度規範化」,最終會導致性能下降。 (我們需要查看查詢!)
有許多方向採取多TB分貝。我們確實需要更多關於您的表格和查詢的信息,然後才能更具體。
鑑於你的查詢負載,你應該考慮分區表。也可能有其他非常合理的解決方案。 –
你的意思是隻在一臺機器上分區,沒有分佈式分區? – Khan
它需要更多地瞭解使用情況。重要的是多少個連接,平均您有和查詢多麼沉重,他們使用。如果他們仍然會大量使用從往年的數據;如果查詢通常僅限於一個特定的一年中,如何快速反應,預計等你和服務器/實例的配置也哪個版本的MySQL - 的CPU /內存/如果使用僅適用於MySQL等。可能發生在某個時刻,您將需要每年單獨的實例,並使用聯合引擎從主連接數據庫查詢它們。但是,如果沒有詳細的負載知識,很難說... – JosMac