分庫分表理論篇——以MySQL為例


分庫分表理論篇——以MySQL為例

一、背景

當今互聯網大爆炸的時代,業務越來越多和大,單庫單表數據超出數據庫支持容量,數據庫I/O操作次數會越來越多和慢,數據庫的整體性能就會急劇下降。

二、如何優化

這裡我想到幾種優化的方法

  • 減少數據庫訪問壓力
  1. 使用緩存技術,對數據庫的信息進行緩存,減少數據庫訪問壓力
  2. 使用Nginx進行靜態資源的獲取,對一些高訪問的網頁,一次訪問時可以先生成靜態頁面存到本地中,用戶再次訪問就會直接返回,這樣減少與數據庫的交互和渲染頁面的操作,提高效率
  3. 讀寫分離

互聯網業務一般讀多寫少,讀寫比例基本是10:1。比如訂單業務,顧客購買商品生成一次訂單後,就會多次查看訂單情況。這時可以採用主從架構,主庫負責DML(增刪改)操作,從庫負責DQL(查看操作),一個主庫可以有多個從庫,極大減輕讀寫壓力

  • 提升數據庫性能
  1. 可以從機器性能入手,內存不夠加內存條,外存( 如硬盤 )不夠加外存,這樣即使數據量在大,也不會影響I/O讀寫速率,但是,數據量大會增加I/O的次數,數據庫性能依舊會下降,不推薦,成本太高,沒錢花,/(ㄒoㄒ)/~~
  2. 優化數據庫索引,數據庫語句,這個我將會寫篇博客,具體介紹
  3. 分庫分表

分庫分表要按業務進行拆分,具體後面會說。主要是打破單庫單表的情況,數據存在多庫多表中。打個比方,100W條數據存在10個庫中,10個庫有10張相同的表,那麼一張表存的數據就會1W條左右,這樣減低數據庫的容量,提升I/O操作速率,提高數據庫的性能

三、什麼是分庫分表

分庫分表,顧名思義就是拆分數據庫和拆分數據表。問題就來了,要怎麼拆分數據庫和數據表呢?

這裡用一張電商的數據庫的ER圖拆分

分庫分表理論篇——以MySQL為例

  • 垂直拆分( 以電商ER圖拆分 )
  1. 垂直拆庫:按照業務拆分,業務耦合性低的數據表拆分到不同數據庫中。比如電商數據庫拆分成用戶庫、商品庫、訂單庫…但是,不是什麼表都可以分庫的,例如:訂單庫有訂單表和訂單明細表,這兩張表耦合性高,必須放在一起
  2. 垂直拆表:按照數據表的字段熱點(就是使用頻率高)和字段存儲類型進行拆分。比如電商中商品不是有文字描述嗎?可是我們一般看商品的標題,價格,圖片,對於文字描述字段一般點進去才看(查看頻率不如前者高),那麼我們可以把商品表除文字描述這些大字段拆分出另一張表使用,提高查詢性能

PS:拆分大字段還有另一個原因,因為大字段讀取時間長,數據量大的話,影響I/O的讀取效率

分庫分表理論篇——以MySQL為例

  • 特點:
  1. 每個庫(表)的結構都不一樣
  2. 每個庫(表)的數據都(至少有一列)一樣
  3. 每個庫(表)的並集是全量數據
  • 水平拆分( 以電商ER圖拆分)
  1. 水平拆庫:把單個數據庫的數據拆分成多個相同結構數據庫存儲
  2. 水平拆表:把單表的數據量拆分成多個相同結構表存儲
分庫分表理論篇——以MySQL為例

  • 以上兩者合併達到分庫分表
分庫分表理論篇——以MySQL為例

  • 特點:
  1. 每個庫(表)的結構都不一樣
  2. 每個庫(表)的數據都(至少有一列)一樣
  3. 每個庫(表)的並集是全量數據

四、優勢和弊端

  • 優點:
  1. 減少數據庫的訪問壓力和單個存儲容量
  • 弊端:
  1. 增加了我們維護成本,畢竟多個數據庫和數據表維護
  2. 分佈式事務(跨庫事務),比如:處理一個業務需要執行多條插入語句,每條在不同機器的不同數據庫中,出現問題,如何回滾
  3. 跨庫join,因為在不同數據庫中,就無法使用join命令獲取信息


原文鏈接:https://blog.csdn.net/weixin_39147889/article/details/104042687


分享到:


相關文章: