如果一個網站業務快速發展,那麼這個網站流量也會增加,資料的壓力也會隨之而來,例如電商系統來說雙十一大促對訂單資料壓力很大,Tps十幾萬並發量,如果傳統的架構(一主多從),主庫容量肯定無法滿足這麼高的Tps ,業務越來越大,單表資料超出了資料庫支援的容量,持久化磁碟IO,傳統的資料庫效能瓶頸,產品經理業務·必須做,改變程序,資料庫刀子切分優化。由於資料庫連接數不足且表中的資料量龐大,即使進行了最佳化,查詢效能仍然較低,因此需要進行分割。
分庫分錶方案是關係型資料庫資料儲存和存取機制的一種補充。
分庫:將一個庫的資料拆分到多個相同的庫中,訪問的時候訪問一個庫
分錶:把一個表的資料放到多個表中,操作對應的某個表就行
#(1) 資料庫垂直拆分
垂直分割特點:
每個函式庫(表)的結構都不一樣
垂直拆分優缺點
優點:
##如果單表的資料量,寫讀壓力大
受某種業務決定,或被限制,也就是說一個業務往往會影響到資料庫的瓶頸(效能問題,如雙十一搶購)
部分業務無法關聯join,只能透過java程式介面去調用,提高了開發複雜度
2. 水平拆分
如圖,按會員庫拆分,拆分成會員1庫,會員2庫,以userId拆分,userId尾號0-5為1庫6-9為2庫,還有其他方式,進行取模,偶數放到1庫,奇數放到2庫
#如圖把users表拆分成users1表和users2表,以userId拆分,進行取模,偶數放到users1表,奇數放到users2表
range來分,每個庫一段連續的數據,這個一般是按比如時間範圍來的,但是這種一般較少用,因為很容易產生熱點問題,大量的流量都打在最新的數據上了,優點:擴容的時候,就很容易,因為你只要預備好,給每個月都準備一個庫就可以了,到了一個新的月份的時候,自然而然,就會寫新的庫了缺點:大部分的請求,都是存取最新的資料。實際生產用range,要看場景,你的用戶不是僅僅訪問最新的數據,而是均勻的訪問現在的數據以及歷史的數據
hash分發,優點:可以平均分配每個函式庫的資料量和請求壓力缺點:擴容起來比較麻煩,會有一個資料遷移的這麼一個過程
每個庫(表)的結構都一樣
##########每個庫(表)的資料都不一樣#### ########每個函式庫(表)的並集是全量資料################(4) 水平分割優缺點######## #####優點:###############單庫/單表的資料保持在一定量(減少),有助於效能提高######## ####提高了系統的穩定性和負載能力###分割表的結構相同,程式改造較少。
#缺點:
#資料的擴容很有難度維護量大
#拆分規則很難抽象化
分片事務的一致性問題部分業務無法關聯join,只能透過java程式介面去呼叫
分散式交易
跨庫join查詢
#分散式全域唯一id
開發成本對程式設計師要求高
(1) 分庫分錶的開源框架
jdbc 直連層:shardingsphere 、tddl
proxy 代理層:mycat,mysql-proxy(360)
jdbc直連層
jdbc直連層又叫jdbc應用層,是因為所有分片規則,所有分片邏輯,包括處理分散式事務所有這些問題它都是在應用層,所有專案都是由war包構成的,所有分片都寫成了jar包,放到了war包裡面,java需要虛擬機去運行的,虛擬機運行的時候就會把war包裡面的位元組檔案進行classLoder載入到jvm記憶體中,所有分片邏輯都是基於記憶體方進行操作的
(2) proxy代理層
如圖,proxy代理層,所有分片規則,所有分片邏輯,包括處理分散式交易都在mycat寫好了,所有分片邏輯都是基於mycat方進行操作
(3) jdbc直連層和proxy代理層優缺點
#jdbc直連層效能高,只支援java語言,支援跨資料庫
proxy代理層開發成本低,支援跨語言,不支援跨資料庫
以上是MySQL分庫分錶的方式有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!