如何使用 MySQL 進行擴展(未準備好正確擴展時)
我們正在使用 MySql。
我的情況
- 我有大量表,每個表都有數百萬行。這些表每秒更新一次,用於添加資訊和檢索資訊。每個表可以是 5GB 或 10GB 甚至更多。
- 我有一張表來保存資訊的總和(類似於我需要的資訊的匯總表),但這也開始變得越來越大。
我的局限
- 目前由於各種原因(主要是沒有知識,時間和預算)我無法更改數據庫
- 我們添加到伺服器的所有額外功能都用於所需的其他資源,因此我無法執行非常繁重的查詢
我想到的擴展的臨時方法
考慮到這些事情,我試圖想辦法用我所擁有的東西來擴展:
- 對於具有數百萬行的表,我認為保留到單獨的數據庫中(可以讓我的備份/導出/更改更輕鬆)。將我的主要數據保存在 1 個數據庫中,並將所有外圍設備(巨大的表)保存到其他數據庫中。假設有一個不同的數據庫來滿足不同的需求。
- 對於我真正需要並且正在快速增長的表格的問題,我正在考慮將其拆分為 XX 個表格。可能是每個使用者 1 個表(可能太多)或每個 XXX 使用者 1 個表。
這些想法是完全瘋狂而且非常糟糕的數據庫設計嗎?
如果是的話……除了一次改變一切之外還有什麼建議嗎?
PARTITIONing
不節省空間。每個分區有 4M-7M 的“空閒”空間。這可以加起來。分區可用於從伺服器中刪除數據(或移動到另一台伺服器)“舊”數據。更多討論:http: //mysql.rjweb.org/doc.php/partitionmaint任何臨時分區也不可能有幫助。那就是拆分錶,在數據庫之間移動(我說的是
CREATE DATABASE
,不是伺服器)不會改變性能,也不會改變空間。另一方面,“更容易備份/導出”可能是一個正當理由。請提供詳細資訊,以便我們討論。“分片”很複雜,但它是跨多個伺服器拆分數據的方式。(注意:我使用“伺服器”來表示單獨的物理機器。)
一個小的修復是縮小表中的數據類型。當(3 個字節)就足夠時,您是否使用
BIGINT
(8 個字節)?MEDIUMINT
等等等等。匯總表是節省空間和加快“報告”速度的絕佳方式。但也許它們沒有盡可能小?讓我們看看
SHOW CREATE TABLE
。“快速增長,我正在考慮將其拆分為 XX 表”——不,不,不!唯一的例外是“分片”時。
您如何填充匯總表?一些提示: http: //mysql.rjweb.org/doc.php/summarytables 我假設您的匯總表是實時更新的,還是每晚更新的?而且您只能增量更新它們,而不是重新開始。
你說每秒插入 1 次?這是一個非常低的比率。也許它比那更快?
當數據被正確索引和/或匯總時,表的大小並不重要(為了性能)。您是否關心磁碟空間或速度?
我認為解決問題的第一步是接受你無法一無所獲。:-)
排除了這種重言式,如果您在不同數據庫之間重新排列表會產生什麼不同,這並不明顯。為什麼你認為這會有所幫助?
對於您正在查看的每個使用者拆分為一個表的表也是如此 - 為什麼這會有所幫助?你在做全表掃描嗎?對錶進行分區可能是一種更清潔的方法,但根據您提供的有限資訊很難給出具體建議。全表掃描的一個常見解決方案是匯總表,您提到您已經在使用它。