Mysql

如何使用 MySQL 進行擴展(未準備好正確擴展時)

  • May 10, 2020

我們正在使用 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 次?這是一個非常低的比率。也許它比那更快?

當數據被正確索引和/或匯總時,表的大小並不重要(為了性能)。您是否關心磁碟空間或速度?

我認為解決問題的第一步是接受你無法一無所獲。:-)

排除了這種重言式,如果您在不同數據庫之間重新排列表會產生什麼不同,這並不明顯。為什麼你認為這會有所幫助?

對於您正在查看的每個使用者拆分為一個表的表也是如此 - 為什麼這會有所幫助?你在做全表掃描嗎?對錶進行分區可能是一種更清潔的方法,但根據您提供的有限資訊很難給出具體建議。全表掃描的一個常見解決方案是匯總表,您提到您已經在使用它。

引用自:https://dba.stackexchange.com/questions/266805