題記:本篇部落格主要是對美團訂單系統分庫分表系統的一些解析和加入了自己的理解,純粹是做筆記,長知識吧,不會構成侵權吧…..緣由
解決辦法
(2)範圍切分
按照範圍來切分,比如說按照時間範圍和id的範圍來進行切分
比如說使用者的id是0-1000000的,請到第乙個資料庫中去查詢,優點是每張表的大小是可以控制的,缺點是集中寫入時候,資料庫壓力過大
(3)hash切分
一般使用取模運算來進行切分,也就是mod切分,圖中db mod代表db取模,tb mod代表tb取模
解釋:比如分庫分表的方案是32個資料庫例項,通過userid進行取模的話就是,將userid後面4位模32然後丟到32個資料庫中,同時又將userid後面4位除以32再mod32丟到32張表裡面,這樣就有1024張表,然後線上部署8個主從例項,每個例項4個資料庫。完畢。
問題: 為什麼是32個例項,我沒有那麼大的規模怎麼辦
回答: 其實32個只是個demo,但是我們這裡hash規則一定要滿足一致性hash,而恰巧mod 2的n次方這種就是一致性hash,所以你的資料庫例項可以是2/4/8/16/32等
問題:為什麼是取後四位
回答:因為美團訂單把使用者後四位融到訂單號裡面了,然後訂單號方案是時間戳+使用者4位標識碼+隨機數,沒有使用單一的集群方案
問題:為什麼這種易於擴充套件?
回答:現在是8個主從例項,以後如果資料庫到瓶頸了那麼就可以部署32個集群,甚至1024個集群,乙個表乙個資料庫一台ip****
加入有一張微博表:
create table weibo (
id int primary key auto_increment comment '主鍵',
user_id int comment '發微博的使用者id',
create_at datetime comment '建立時間',
...其他字段
) comment '微博';
單庫情況下查詢當前最新20條微博的sql語句為:
select * from weibo order
by create_at desc limit 20;
分庫情況下的sql語句為:
use db_1;
select * from weibo order
by create_at desc limit 20;
use db_2;
select * from weibo order
by create_at desc limit 20;
use db_3;
select * from weibo order
by create_at desc limit 20;
然後你需要對這60個最新的,然後進行排序,找出個前20個最新的出來。top k問題
總而言之:水平拆分會把業務變得非常複雜,能用垂直拆分解決就盡量用垂直拆分,不要用水平拆分。盡量使用對業務影響較小的讀寫分離,垂直分庫等方案
然後還有一點是,既然在不同的資料庫中,那麼id可能會相同,所以就不要用自增了。
分庫分表實踐
1 為什麼要分庫分表?資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,表中的資料量會越來越大,相應地,資料操作,增刪改查的開銷也會越來越大 另外乙個db所能承載的資料量 資料處理能力都會成為瓶頸。2 分庫分表實施策略 分庫分表有垂直切分和水平切分兩種 1 垂直切分即將...
分庫分表落地解決方案
隨著系統不斷的執行,當資料庫的資料開始超過千萬 上億時,mysql資料庫將承受更大的壓力。資料是企業生存的根本,資料庫的健康狀況將直接決了定企業的競爭力。為了更好的緩解資料庫壓力,使得系統更高效的執行,落地的解決方案有 1 分庫 也叫垂直拆分,即 每個模組對應乙個單獨的資料庫 2 分表 也叫水平拆分...
分庫分表最佳實踐大總結
一 隨著企業業務的增長,訪問量和使用者等資料的增加,傳統的關聯式資料庫已經不能滿足需求 分表分庫就成了節省成本 和良好擴充套件性的必然選擇 網上也有很多開源的分表分庫的軟體,也公司自己開發實現 而終其原理和步驟都無外乎三步 即首先sql解析路由,再根據路由確定分片,然後結果集合並 所遇到的分表分庫的...