搜尋
首頁資料庫mysql教程今天終於把Mysql分庫分錶搞清楚了,面試可以吹牛了!

前言

公司最近在搞服務分離,資料切分方面的東西,因為單張包裹表的資料量實在是太大,並且還在以每天60W的量成長。

之前了解資料庫的分庫分錶,讀過幾篇博文,但就只知道個模糊概念, 而且現在回想起來什麼都是模模糊糊的。

今天看了一個下午的資料庫分庫分錶,看了很多文章,現在做個總結:

第一部分:實際網站發展過程中面臨的問題。

第二部分:有哪幾種切分方式,垂直和水平的區別和適用面。

第三部分:目前市面有的一些開源產品,技術,它們的優缺點是什麼。

第四部分:可能是最重要的,為什麼不建議水平分庫分錶! ?這能讓你能在規劃前期謹慎的對待,避免掉切分造成的問題。

名詞解釋

#庫:database;表:table;分庫分錶:sharding

資料庫架構演進剛開始我們只用單機資料庫就夠了,隨後面對越來越多的請求,我們將資料庫的寫入操作和讀取操作進行分離, 使用多個從庫副本(Slaver Replication)負責讀取,使用主庫(Master )負責寫, 從庫從主庫同步更新數據,保持數據一致。架構上就是資料庫主從同步。從庫可以水平擴展,所以更多的讀取請求不成問題。

但是當使用者量級上來後,寫入請求越來越多,該怎麼辦?加一個Master是不能解決問題的, 因為資料要保存一致性,寫入操作需要2個master之間同步,相當於重複了,而且更加複雜。

這時就需要用到分庫分錶(sharding),對寫入操作進行切分。

分庫分錶前的問題

任何問題都是太大或太小的問題,我們這裡面對的資料量太大的問題。

用戶請求量太大

因為單一伺服器TPS,內存,IO都是有限的。

解決方法:分散請求到多個伺服器上;其實用戶請求和執行一個sql查詢是本質是一樣的,都是請求一個資源,只是用戶請求還會經過網關,路由,http伺服器等。

單庫太大

單一資料庫處理能力有限;

單庫所在伺服器上磁碟空間不足;

單庫上操作的IO瓶頸

解決方法:切分成更多更小的函式庫

單表太大

CRUD都成問題;

索引膨脹,查詢逾時

解決方法:切分成多個資料集更小的表。

分庫分錶的方法

#一般就是垂直切分和水平切分,這是一個結果集描述的切分方式,是物理空間上的切分。

我們從面臨的問題,開始解決。

闡述:
首先是使用者請求量太大,我們就堆機器搞定(這不是本文重點)
然後是單一函式庫太大,這時我們要看是因為表多而導致資料多,還是因為單張表裡面的資料多。
如果是因為表格多而資料多,使用垂直切分,依業務切分成不同的函式庫。
如果是因為單張表的資料量太大,這時要用水平切分,即把表的資料以某種規則切分成多張表,甚至多個庫上的多張表。

分庫分錶的順序應該是先垂直分,後水平分。因為垂直分比較簡單,更符合我們處理現實世界問題的方式。

垂直拆分

垂直分錶

#也就是“大表拆小表”,基於列欄位進行的。一般是表格中的欄位較多,將不常用的, 資料較大,長度較長(如text類型欄位)的分割到「擴充表」。一般是針對那種幾百列的大表,也避免查詢時,資料量太大造成的「跨頁」問題。

垂直分庫

垂直分庫針對的是一個系統中的不同業務進行拆分,例如使用者User一個庫,商品Producet一個庫,訂單Order一個庫。切分後,要放在多個伺服器上,而不是一個伺服器上。為什麼?我們想像一下,購物網站對外提供服務,會有用戶,商品,訂單等的CRUD。在沒拆分前,全部都是落到單一的庫上的,這會讓資料庫的單庫處理能力成為瓶頸。按垂直分庫後,如果還是放在一個資料庫伺服器上, 隨著使用者量增大,這會讓單一資料庫的處理能力成為瓶頸,還有單一伺服器的磁碟空間,內存,tps等非常吃緊。所以我們要分割到多個伺服器上,這樣上面的問題都解決了,以後也不會面對單機資源問題。

資料庫業務層面的拆分,和服務的治理降級機制類似,也能對不同業務的資料分別的進行管理,維護,監控,擴展等。資料庫往往最容易成為應用系統的瓶頸,而資料庫本身屬於有狀態的,相對於Web和應用程式伺服器來講,是比較難實現橫向擴充的。資料庫的連線資源較寶貴且單機處理能力也有限,在高並發場景下,垂直分庫一定程度上能夠突破IO、連線數及單機硬體資源的瓶頸。

水平分割

水平分錶

#針對資料量龐大的單張表(例如訂單表),依照某種規則(RANGE,HASH取模等),切分到多張表裡面去。但這些表還是在同一個庫中,所以庫層級的資料庫操作還是有IO瓶頸。不建議採用。

水平分庫分錶

將單張表的資料切分到多個伺服器上去,每個伺服器具有對應的庫與表,只是表中資料集合不同。水平分庫分錶能夠有效的緩解單機和單庫的效能瓶頸和壓力,突破IO、連線數、硬體資源等的瓶頸。

水平分庫分錶切分規則

  • RANGE

    從0到10000一個表,10001到20000一個表;

  • HASH取模

    一個商場系統,一般都是將用戶,訂單作為主表,然後將和它們相關的作為附表,這樣不會造成跨庫事務之類的問題。取用戶id,然後hash取模,分配到不同的資料庫。

  • 地理區域

    例如依照華東,華南,華北這樣來區分業務,七牛雲應該就是如此。

  • 時間

    依照時間切分,就是將6個月前,甚至一年前的資料切出去放到另外的一張表,因為隨著時間流逝,這些表的資料被查詢的機率變小,所以沒必要和「熱資料」放在一起,這個也是「冷熱資料分離」。

分庫分錶後面臨的問題

#交易支援

分庫分錶後,就成了分散式事務了。

如果依賴資料庫本身的分散式事務管理功能去執行事務,將付出高昂的效能代價;如果由應用程式去協助控制,形成程式邏輯上的事務,又會造成程式設計方面的負擔。

多庫結果集合並(group by,order by)

類似於group by,order by這樣的分組和排序語句無法使用​​

跨庫join

分庫分錶後表之間的關聯操作將受到限制,我們無法join位於不同分庫的表,也無法join分錶粒度不同的表, 結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。粗略的解決方法:全局表:基礎數據,所有庫都拷貝一份。字段冗餘:這樣有些字段就不用join去查詢了。系統層組裝:分別查詢出所有,然後組裝起來,較複雜。

分庫分錶方案產品

目前市面上的分庫分錶中間件相對較多,其中基於代理方式的有 MySQL ProxyAmoeba, 基於Hibernate框架的是Hibernate Shards,基於jdbc的有當當sharding-jdbc, 基於mybatis的類似maven插件式的有蘑菇街的蘑菇街TSharding, 透過重寫spring的ibatis template類別的Cobar Client

還有一些大公司的開源產品:

今天終於把Mysql分庫分錶搞清楚了,面試可以吹牛了!


我是程式設計師青戈,一個愛生活、愛分享的90後程式設計師。


本期關於Mysql分庫分庫分錶的介紹和解決方案介紹到這裡,希望能幫助到大家,後續更多Java面試類的文章請持續關注公眾號Java學習指南

以上是今天終於把Mysql分庫分錶搞清楚了,面試可以吹牛了!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:Java学习指南。如有侵權,請聯絡admin@php.cn刪除
說明InnoDB重做日誌和撤消日誌的作用。說明InnoDB重做日誌和撤消日誌的作用。Apr 15, 2025 am 12:16 AM

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

在解釋輸出(類型,鍵,行,額外)中要查找的關鍵指標是什麼?在解釋輸出(類型,鍵,行,額外)中要查找的關鍵指標是什麼?Apr 15, 2025 am 12:15 AM

EXPLAIN命令的關鍵指標包括type、key、rows和Extra。 1)type反映查詢的訪問類型,值越高效率越高,如const優於ALL。 2)key顯示使用的索引,NULL表示無索引。 3)rows預估掃描行數,影響查詢性能。 4)Extra提供額外信息,如Usingfilesort提示需要優化。

在解釋中使用臨時狀態以及如何避免它是什麼?在解釋中使用臨時狀態以及如何避免它是什麼?Apr 15, 2025 am 12:14 AM

Usingtemporary在MySQL查詢中表示需要創建臨時表,常見於使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通過優化索引和重寫查詢避免其出現,提升查詢性能。具體來說,Usingtemporary出現在EXPLAIN輸出中時,意味著MySQL需要創建臨時表來處理查詢。這通常發生在以下情況:1)使用DISTINCT或GROUPBY時進行去重或分組;2)ORDERBY包含非索引列時進行排序;3)使用複雜的子查詢或聯接操作。優化方法包括:1)為ORDERBY和GROUPB

描述不同的SQL交易隔離級別(讀取未讀取,讀取,可重複的讀取,可序列化)及其在MySQL/InnoDB中的含義。描述不同的SQL交易隔離級別(讀取未讀取,讀取,可重複的讀取,可序列化)及其在MySQL/InnoDB中的含義。Apr 15, 2025 am 12:11 AM

MySQL/InnoDB支持四種事務隔離級別:ReadUncommitted、ReadCommitted、RepeatableRead和Serializable。 1.ReadUncommitted允許讀取未提交數據,可能導致臟讀。 2.ReadCommitted避免臟讀,但可能發生不可重複讀。 3.RepeatableRead是默認級別,避免臟讀和不可重複讀,但可能發生幻讀。 4.Serializable避免所有並發問題,但降低並發性。選擇合適的隔離級別需平衡數據一致性和性能需求。

MySQL與其他數據庫:比較選項MySQL與其他數據庫:比較選項Apr 15, 2025 am 12:08 AM

MySQL適合Web應用和內容管理系統,因其開源、高性能和易用性而受歡迎。 1)與PostgreSQL相比,MySQL在簡單查詢和高並發讀操作上表現更好。 2)相較Oracle,MySQL因開源和低成本更受中小企業青睞。 3)對比MicrosoftSQLServer,MySQL更適合跨平台應用。 4)與MongoDB不同,MySQL更適用於結構化數據和事務處理。

MySQL索引基數如何影響查詢性能?MySQL索引基數如何影響查詢性能?Apr 14, 2025 am 12:18 AM

MySQL索引基数对查询性能有显著影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

MySQL:新用戶的資源和教程MySQL:新用戶的資源和教程Apr 14, 2025 am 12:16 AM

MySQL學習路徑包括基礎知識、核心概念、使用示例和優化技巧。 1)了解表、行、列、SQL查詢等基礎概念。 2)學習MySQL的定義、工作原理和優勢。 3)掌握基本CRUD操作和高級用法,如索引和存儲過程。 4)熟悉常見錯誤調試和性能優化建議,如合理使用索引和優化查詢。通過這些步驟,你將全面掌握MySQL的使用和優化。

現實世界Mysql:示例和用例現實世界Mysql:示例和用例Apr 14, 2025 am 12:15 AM

MySQL在現實世界的應用包括基礎數據庫設計和復雜查詢優化。 1)基本用法:用於存儲和管理用戶數據,如插入、查詢、更新和刪除用戶信息。 2)高級用法:處理複雜業務邏輯,如電子商務平台的訂單和庫存管理。 3)性能優化:通過合理使用索引、分區表和查詢緩存來提升性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。