在mysql中,每個資料庫最多可創建20億個表,一個表允許定義1024列,
單表能存盤的最大上限:
MyISAM存盤引擎:64 PB
Innodb存盤引擎:64 TB (包括這個表的所有索引等其他相關資料)
從以上資料可以看出,MySQL的單表上限足夠大,所以單表大小限制已經不是有MySQL資料庫本身來決定,而是由所在主機作業系統上面的檔案系統來決定了,
一、業務場景:
隨著業務不斷發展,資料表的資料量也會隨之不斷增長,當我們單張表的資料量過大時,對應系統整體的性能都會下降,這個時候,或許增加索引也不能很明顯提高搜索性能,反而付出了更多的寫資料的性能,
一般業界認為,單張表超過500萬條記錄,就應該考慮分表了,
實際情況都不一樣,這個值只是參考,
二、解決辦法:
為了解決以上業務場景出現的問題,從整體性能優化考慮,我們一般采用的做法是分庫分表策略,
分庫分表概念:
分庫:將存盤在同一個資料庫的資料,拆分存盤到多個資料庫,降低單個資料庫的訪問壓力,
分表:將存盤在同一張表的資料,拆分存盤到多張表,降低單張表的訪問壓力,
(一)分表:
一張表的存盤容量是有上限的,具體容量上限受到很多因素影響(比如作業系統、檔案系統、表的欄位數等);同時,隨著單張表所存盤的記錄數越來越大,訪問該表的性能也在逐步緩慢下降,當達到一定的資料量之后,訪問性能會急劇下降,導致影響系統性能和穩定性,
此時,我們就需要對這張表進行拆分,拆成多張表,
分表拆分策略:

1、水平拆分:
按照某個欄位的某種規則,將一張表的資料拆分存盤到多張表中,
特點:
(1)一張表只保存一部分資料,每張表的記錄數可能不一樣,
(2)拆分出的多張表的表結構都一樣(欄位相同、索引相同)
水平拆分策略演算法有哪些呢?
范圍、列舉、時間、取模、哈希、指定等,
2、垂直拆分:
將該表中一些不常用欄位或者大文本欄位拆分出來,新建附屬資訊表來存盤,
特點:
(1)表中存盤所有的資料,只是個別欄位劃分出去,新建的附屬表也存盤所有的資料記錄
(2)欄位發生改變,要評估對業務系統的影響
以上兩種方式可以選擇其中一種方式優化,也可以兩種方式都做,但是垂直拆分要考慮對原有舊代碼的影響面大不大,從而評估優化的難度和耗時,條件允許的情況下,建議以上兩種優化方式都做,
(二)分庫:
一個資料庫的連接數是有上限的,能同時處理的并發量也是有上限的,當我們的業務系統變得越來越繁雜時,如果都存盤在一個資料庫中,那么就會因為資料庫達到瓶頸而影響業務系統的正常使用,
mysql5.5默認的最大連接數為151,上限為100000,
修改mysql默認的最大連接數
在/etc/my.cnf檔案中[mysqld]部分增加max_connections=1000,重啟mysql服務,
此時,我們就需要對資料庫進行拆分,將一個庫拆分成多個資料庫,
資料庫拆分原則:根據系統業務實際情況,將原本存盤在一個資料庫中的資料分散存盤到多個資料庫中去,減少單庫的負載,
分庫拆分策略:
水平拆分:把同一個表拆到不同的資料庫中;
垂直拆分:把不同的表拆到不同的資料庫中;

1、水平拆分:
將一張表的資料分別存盤到多個資料庫中,一個庫中只保存一部分資料;
水平拆分-優點:
1. 不存在單庫大資料,高并發的性能瓶頸,
2. 對應用透明,應用端改造較少,
3. 提高了系統的穩定性跟負載能力,
水平拆分-缺點:
1. 拆分規則難以抽象,
2. 分片事務一致性難以解決,
3. 資料多次擴展難度跟維護量極大,
4. 跨庫join性能較差,
2、垂直拆分:
將資料庫中的各個表,依據業務情況將一些表放在一個資料庫中,一些表放在另外一個資料庫中,
垂直拆分-優點:
1. 拆分后業務清晰,拆分規則明確,
2. 系統之間整合或擴展容易,
3. 資料維護簡單,
垂直拆分-缺點:
1. 部分業務表無法join連表,只能通過介面方式解決,提高了系統復雜度,
三、總結
現實環境中,分表分庫并不是只能選擇其一,在復雜的業務系統中,更多情況下是多種策略組合的方式來進行整體性能優化,
舉例:垂直分庫+水平分表組合策略下的結果,如下圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/347291.html
標籤:其他
上一篇:Docker+Docker-compose部署Springboot專案-前后端分離
下一篇:nginx 防盜鏈配置
