一文帶你詳解MYSQL數據庫分庫分表原理

今天咱們來學習MYSQL的分庫分表sql

  • 面對訪問數據庫海量數據的狀況,這張圖帶你解決數據庫壓力問題
  • 一、爲何要進行分庫分表???

分庫分表是爲了解決因爲數據量過大而致使數據庫性能下降的問題,將原來獨立的數據庫拆分紅若干數據庫組成,將數據大表拆分紅若干數據表組成,使得單一數據庫、單一數據表的數據量變小,從而達到提高數據性能的目的。 數據庫

  • 二、什麼是分庫分表???
  • 三、分表的優勢???

  • 四、如何分庫???

垂直分庫: 按照業務將表進行分類,分不到不一樣的數據庫上面,每一個庫能夠放在不一樣的服務器上,在分佈式系統中實現專庫專用。

案例:將商品信息表和商品描述表放在商品庫,店鋪表放在店鋪庫。bash

水平分庫: 因爲單庫數據量太大,按照必定規則分紅和庫中表字段的類型一致的不一樣庫中,每一個庫放在不一樣服務器上,減輕磁盤、cpu、內存的壓力。

案例:將商品表分紅兩個字段類型同樣的商品表,分到兩個不一樣的服務器數據庫中。服務器

垂直分庫和水平分庫的區別:

垂直分庫:把不一樣表分到不一樣的數據庫中(商品表和店鋪表)網絡

水平分庫:把不一樣數據分到不一樣數據庫中(商品表分紅兩個類型同樣的表分到不一樣數據庫中)框架

  • 五、如何分表???
    • 垂直分表: 將一張海量數據的表按照使用頻次垂直切分,例如:用戶表中多個字段,用戶信息、用戶學習、用戶工做,將按照他們的使用頻次垂直切分到不一樣的表中,減小單表的訪問壓力。

案例:將商品信息表按照訪問頻率分爲兩個表,商品信息和商品描述表 分佈式

水平分表: 在同一個數據庫內,把同一個表的數據按照業務屬性、時間、取鍵、Hash、數據量進行切分到多個表中。

案例: 將同一個庫中的商品表的數據分紅兩個商品表中,能夠在一個或多個庫中函數

垂直分表和水平分表的區別:性能

垂直分表: 將一個表按照字段訪問的頻次分到多個表中,能夠是一個或多個數據庫(分的是字段) 水平分表: 將一個表按照數據分到多個表中,能夠是一個或多個數據庫(分的是數據)學習

  • 六、水平分表面臨的困難及開源產品

數據庫代理方式訪問:

非代理方式訪問:SQL語句直接訪問數據庫服務器,比代理方式訪問快。

MYSQL Fabric官方產品對於分表仍是比較實用的。
水平分表的實現雖然難以實現,可是對於本身特定項目的分庫分表仍是比較好實現的,對於通用的分庫分表難以實現,下來就看怎麼實現吧!!!

  • 七、基本的實現思路:

一、解析路由(找對應數據源、表):根據業務功能、SQL解析等方式,找到要訪問的數據源和表

二、執行相應表的功能(根據sql實現具體功能)

三、對查詢結果集進行合併,二次處理。(合併查詢結果集,執行子查詢)

四、是否有事務(處理不一樣方式的事務)

  • 八、實現的層面

推薦使用DAO層實現方式

  • 九、小結

  • 十、分庫分錶帶來的問題

分庫分表能有效的緩解單機和單庫帶來的性能瓶頸和壓力,突破網絡IO、硬件資源、鏈接屬的瓶頸,同時也帶來了一些問題

一、事務一致性問題

分庫分表把數據分佈到不一樣的數據庫服務器,不可避免帶來分佈式事務問題

二、跨節點關聯查詢

原本能夠經過join鏈接查詢的sql語句,如今得兩次查詢

第一次:查到關聯數據的id。

第二次:根據id找到對應的數據。

三、跨節點分頁、排序函數

合二爲一

四、主鍵避重

全局主鍵解決主鍵重複問題

五、公共表

例如:地區表(商品表和店鋪表的依賴公共表)

在每一個數據庫服務中都創建公共表,全部對公共表的更新操做都同時發送到全部分庫執行。


小夥伴們,對於MYSQL數據庫的分庫分表理論就介紹到這裏了,下期咱們用sharding-JDBC框架來實現吧!!!

get到的小夥伴記得點贊👍+關注哦!小紅♥走起來!!!😘😘😘
複製代碼
相關文章
相關標籤/搜索