11 分庫分表

2021-10-01 10:59:35 字數 1413 閱讀 2544

雪花演算法:

單元化:

傳統的專案結構將所有子系統的資料都交給乙個mysql,無法支撐

這涉及到資料庫效能的瓶頸:

1 資料庫連線數有限:預設100個,單機最大16384

2 表資料量:單機表數量過多,表資料也過多

3 硬體問題:硬體資源不夠

進行了資料庫效能優化之後:引數優化、索引優化、讀寫分離,還是不夠,因此需要最終方案:分庫分表

一般在表的數量達到了幾百上千時,考慮進行分庫

資料達到千萬級別時,考慮進行分庫或分表

一般分庫是必須的,這樣才能用到多機

按照切分規則,可分為垂直切分和水平切分

分庫:按照業務模組進行切分,將不同模組的表切分到不同的資料庫中

分表:按照欄位的業務進行切分,將不同業務的字段切分到不同的表中,即大表拆小表(可以不分庫,但是意義不大,效能瓶頸還是在單機)

此方案在表和資料過多的時候也不好,因為按欄位、表切的本質是按照業務來劃分的,而業務總是固定的那幾個,如果資料過多,無法再繼續拆分

因此建議使用水平切分,不要按欄位、表切,而是按行切

此方案必須分庫:將一張大表按照一定的切分規則,按照行切分資料後,分到不同的庫中的表

每個庫都有相同的表,通過一定的規則,如hash,將資料分布在不同庫上的表

er分片:不同表有關聯關係的字段要把值相同的放在同乙個庫里,可以避免跨庫連線,還可以使用全域性表來避免

規則:

按照id取模

按照日期

按照範圍

規則涉及分片鍵和分片演算法,分片策略則是根據演算法的選擇得出的

第一原則:能不切分盡量不要切分

第二原則:如果要切分,則一定要選擇合適的切分規則,提前規劃好,因為遷移是很困難的

第三原則:資料切分盡量通過資料冗餘或表分組來降低跨庫join的可能

一般採用補償事務,即利用記錄日誌的方式來實現最終一致性

需要保證不同庫上的表的主鍵id不衝突

解決:本質就是由中間人來管理

1 redis的incr命令

2 資料庫專門用乙個表來生成主鍵

3 uuid(不建議:太長佔空間,有可能重複)

4 snowflake演算法:能在分布式系統中生成全域性唯一且趨勢遞增的id

使用全域性表或er分片解決

全域性表(也叫**表)建議為資料少的,不經常改變的,如等級表

如果需要關聯的表過大,則使用er分片:將有er關係的記錄(行)都儲存都乙個庫中

如果實在要跨庫,則最多兩張,三張就太慢了

tddl、cobar、mycat、sharding-jdbc

現在常用的是sharding-jdbc,取代了mycat

由於資料庫連線問題,分庫分表並不能無限擴容,需要借助單元化來實現:

mysql分表分庫實現 MySql分表分庫思路

一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...

MySQL範圍分表分庫 mysql 分表分庫策略

唯一id的生成 下面列舉幾種常見的唯一id生成方案,需要滿足兩大核心需求 1.全域性唯一 2趨勢有序 1.用資料庫的auto increment 自增id 來生成,每次通過寫入資料庫一條記錄,利用資料庫id自增的特性獲取唯一,有序的id。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...

mysql 分庫分表實戰 MySQL分庫分表實戰

為什麼要分庫分表 在大型 中,當使用者量以及使用者產生的業務資料量達到單庫單錶效能極限時,為了支撐業務可持續發展,對於重要的核心業務必然要進行分庫分表來儲存業務資料。對於非核心業務產生的大量資料,例如爬蟲爬取的資訊,論壇產生的資料等,可以考慮把資料儲存在像mongodb這樣的nosql儲存裡面,這些...