玩原神學編程-數(shù)據(jù)庫分庫分表是啥?讀擴散又是啥?
2023-08-04 02:23 作者:星痕_MeteorV | 我要投稿

- 如果我們不分表,那表就會很大,很長,分布在硬碟的各個地方,讀取 I/O 就會變多
- 所以要垂直分表或是水評分表
- 垂直分表 : 直接把幾個 column 抓出去。而可以減輕壓力的原因是 column 變小了。 B+ 樹儲存的話,數(shù)據(jù)其實都放在 “數(shù)據(jù)頁” 裡面,例如大小 16K。 但是 column 很多的話 row 就會相對小。這樣都在同個數(shù)據(jù)頁就能找到(涵蓋)的話就不用這整個 16K 找完還得往下一個 16K 去找。
- 水平分表 : 就是切 row,一般一個單位是 500w~2000w。
- 最常見的是取 mod,難點在如果想擴充就得做 migration 然後頭疼。
- 若我們用 range 去分表,例如第一張放 [1~2kw), 第二張放 [2kw~4kw) 這樣就能無限擴充了。 但這樣如果剛好某一個 range 的資料被頻繁讀寫,那就會有 Read/Write Hotspot 問題。 (例如剛好 2023 註冊的玩家特別活躍)
- 解決熱點問題最簡單方案就是產(chǎn) ID 的時候隨機。
- 另一種解決熱點問題的方式是上層用 range 分表,然後底下再用 mod 分表 例如 3kw 先到第二張,然後再取 mod 來到更小的表查詢。 這樣可以從讀寫單表變成讀寫多表。
- “沒有什麼是加中間層不能解決的,如果有,那就再加一層” 至於中間層的實現(xiàn)方式,可以用 orm,也可以用 proxy 去做中間層分表路由邏輯
- 讀擴散問題 : 如果我想查詢一個非主鍵的資料,而因為分表的關(guān)係我得同時查可能 200 張表。(因為它不像是 ID 我可以直接知道 range 在哪就去 access 哪張表)
- 一種解法是建一個分片表,然後把那個普通的 column 當做一個 key,然後 id 變成 data。有點像倒排索引。缺點是你得維護兩張表而且更改的時候要同時更改。
- 點讚破 500 了我還是沒看到 up 的解答,救。 我自己是想那就建一個新的 pk 吧。
標簽: