首頁  >  文章  >  資料庫  >  MySQL分庫分錶的方式有哪些

MySQL分庫分錶的方式有哪些

WBOY
WBOY轉載
2023-06-02 12:34:143284瀏覽

    一、為什麼要分庫分錶

    如果一個網站業務快速發展,那麼這個網站流量也會增加,資料的壓力也會隨之而來,例如電商系統來說雙十一大促對訂單資料壓力很大,Tps十幾萬並發量,如果傳統的架構(一主多從),主庫容量肯定無法滿足這麼高的Tps ,業務越來越大,單表資料超出了資料庫支援的容量,持久化磁碟IO,傳統的資料庫效能瓶頸,產品經理業務·必須做,改變程序,資料庫刀子切分優化。由於資料庫連接數不足且表中的資料量龐大,即使進行了最佳化,查詢效能仍然較低,因此需要進行分割。

    二、什麼是分庫分錶

    • 分庫分錶方案是關係型資料庫資料儲存和存取機制的一種補充。

    • 分庫:將一個庫的資料拆分到多個相同的庫中,訪問的時候訪問一個庫

    • 分錶:把一個表的資料放到多個表中,操作對應的某個表就行

    ##三、分庫分錶的幾種方式

    MySQL分庫分錶的方式有哪些

    1.垂直拆分

    #(1) 資料庫垂直拆分

    MySQL分庫分錶的方式有哪些

    MySQL分庫分錶的方式有哪些

    • #依業務拆分,如圖,電商系統,拆分成訂單庫,會員庫,商品庫
    • (2)表垂直拆分
    根據業務去拆分錶,如圖,把user表拆分成user_base表和user_info表,use_base負責儲存登錄,user_info負責儲存基本用戶資訊

    垂直分割特點:

    每個函式庫(表)的結構都不一樣
    • 每個庫(表)的資料至少一列一樣
    • 每個庫(表)的並集是全量資料

    垂直拆分優缺點

    • 優點:

    • #拆分後業務清晰(專庫專用依業務拆分)
    • 資料維護簡單,依業務不同,業務放到不同機器上

    MySQL分庫分錶的方式有哪些

    ##如果單表的資料量,寫讀壓力大

    MySQL分庫分錶的方式有哪些

    受某種業務決定,或被限制,也就是說一個業務往往會影響到資料庫的瓶頸(效能問題,如雙十一搶購)

    部分業務無法關聯join,只能透過java程式介面去調用,提高了開發複雜度

    • 2. 水平拆分

    • (1) 資料庫水平拆分

    如圖,按會員庫拆分,拆分成會員1庫,會員2庫,以userId拆分,userId尾號0-5為1庫6-9為2庫,還有其他方式,進行取模,偶數放到1庫,奇數放到2庫

      (2) 表水平拆分
    • #如圖把users表拆分成users1表和users2表,以userId拆分,進行取模,偶數放到users1表,奇數放到users2表

    • 水平拆分的其他方式:

    range來分,每個庫一段連續的數據,這個一般是按比如時間範圍來的,但是這種一般較少用,因為很容易產生熱點問題,大量的流量都打在最新的數據上了,優點:擴容的時候,就很容易,因為你只要預備好,給每個月都準備一個庫就可以了,到了一個新的月份的時候,自然而然,就會寫新的庫了缺點:大部分的請求,都是存取最新的資料。實際生產用range,要看場景,你的用戶不是僅僅訪問最新的數據,而是均勻的訪問現在的數據以及歷史的數據

    hash分發,優點:可以平均分配每個函式庫的資料量和請求壓力缺點:擴容起來比較麻煩,會有一個資料遷移的這麼一個過程

    • (3) 水平分割特性

    • 每個庫(表)的結構都一樣

      ##########每個庫(表)的資料都不一樣#### ########每個函式庫(表)的並集是全量資料################(4) 水平分割優缺點######## #####優點:###############單庫/單表的資料保持在一定量(減少),有助於效能提高######## ####提高了系統的穩定性和負載能力###
    • 分割表的結構相同,程式改造較少。

    #缺點:

    • #資料的擴容很有難度維護量大

    • #拆分規則很難抽象化

    • 分片事務的一致性問題部分業務無法關聯join,只能透過java程式介面去呼叫

    四、分庫分錶帶來的問題

    • 分散式交易

    • 跨庫join查詢

    • #分散式全域唯一id

    • 開發成本對程式設計師要求高

    五、分庫分錶技術如何選型

    (1) 分庫分錶的開源框架

    • jdbc 直連層:shardingsphere 、tddl

    • proxy 代理層:mycat,mysql-proxy(360)

    jdbc直連層

    MySQL分庫分錶的方式有哪些

    jdbc直連層又叫jdbc應用層,是因為所有分片規則,所有分片邏輯,包括處理分散式事務所有這些問題它都是在應用層,所有專案都是由war包構成的,所有分片都寫成了jar包,放到了war包裡面,java需要虛擬機去運行的,虛擬機運行的時候就會把war包裡面的位元組檔案進行classLoder載入到jvm記憶體中,所有分片邏輯都是基於記憶體方進行操作的

    (2) proxy代理層

    MySQL分庫分錶的方式有哪些

    如圖,proxy代理層,所有分片規則,所有分片邏輯,包括處理分散式交易都在mycat寫好了,所有分片邏輯都是基於mycat方進行操作

    (3) jdbc直連層和proxy代理層優缺點

    • #jdbc直連層效能高,只支援java語言,支援跨資料庫

    • proxy代理層開發成本低,支援跨語言,不支援跨資料庫

    以上是MySQL分庫分錶的方式有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除