Mysql優化調查,從單庫優化到分庫、分表 MySQL 上億大表如何優化? SpringBoot + Sharding JDBC 分庫分表

背景
在中小型項目的開發中,一般還是使用單一的數據庫。在數據庫的數據量不多的時候,sql語句想怎麼寫就怎麼寫,不要太任性。數據量一多,查詢慢,連接超時,連接數不夠等等各種問題湧現出來。怎麼辦呢?優化吧!今天就來說說關於數據庫應該怎麼優化的思路。

一、單個數據庫的優化方案(不分庫分表)

1、軟優化

  • 數據庫參數的調整,例如連接數(默認100,最大16384)、內存量;
  • 慢Sql的檢索,分析執行計劃,進行SQL和程序的優化;
  • 優化數據庫的索引結構;
  • 優化數據庫的表結構(該冗餘的還是要冗餘);
  • 引入NoSql和程序結構調整(讀寫分離)。
    參考鏈接:
    sql優化的15個小技巧expplain使用

    MySQL 上億大表如何優化?

2、硬優化

提升系統硬件(更快的IO、更多的內存):帶寬、CPU、硬盤等等。

單個數據庫的優化,也是有優化空間的,優化到一定程度,還是存在一些問題。更或者在設計之初,就預料到單個數據庫不能滿足我們的業務需求,那就分庫吧,讀寫庫分離,分庫分表。

二、Mysql主從庫分離(讀寫庫)

主從庫,一個主庫主要負責寫操作,一個或多個從庫主要負責讀操作。

相關資料參考:

MySQL多實例安裝 + 主從配置

SpringBoot整合Mysql主從庫,動態分配數據源

三、分庫分表

在設計分庫分表之前,一定要問一下自己,爲什麼要分庫分表?分表是爲了解決單表海量數據的查詢性能問題。分庫是爲了解決單臺數據庫的併發訪問壓力問題。

1、分庫分表的概念
分庫,就是將一個數據庫分成多個數據庫,部署到不同機器上。分表,就是一個數據庫表分成多個表。分庫分表方案,一種是垂直拆分,一種是水平拆分。

2、垂直拆分、水平拆分概念

垂直拆分:就是把一個有很多字段的表拆分成多個表,或分到多個庫上。每個庫表的結構都不一樣,每個庫表都包含部分字段。

水平拆分:同一個表的數據拆到不同的庫不同的表中。拆分後的每個表結構保持一致。可以根據時間、地區、業務鍵維度、hashcode等進行拆分,最後通過路由訪問到具體的數據。

3、垂直、水平拆分細化


3.1、垂直分表“⼤表拆⼩表”,基於列字段進⾏。將一張寬表(字段很多的表),按照字段的訪問頻次進行拆分,或者按照表單結構進行拆分。★ 業務場景表字段太多,每個字段訪問頻率不⼀樣,浪費了IO資源,需要進⾏優化。

☝ 拆分原則

  • 根據業務維度進行拆分,如訂單表可以拆分爲訂單基本信息、訂單地址、訂單商品等表;
  • 根據數據冷熱程度拆分,20%的熱點字段拆到一個表,80%的冷字段拆到另外一個表。

▶ 舉個例子

有一個訂單表,字段有:訂單號、訂單狀態、訂單總價、訂單優惠金額、訂單實際支付金額、訂單地址、訂單內容、訂單備註、訂單發票狀態等等字段。

按照垂直分表,可以分爲訂單表1和訂單表2。

訂單表1中的字段有:訂單號、訂單狀態、訂單總價、訂單優惠金額、訂單實際支付金額等。

訂單表2中有訂單號、訂單地址、訂單內容、訂單備註、訂單發票狀態字段等。

2、垂直分庫
根據不同的業務,將表進行分類,拆分到不同的數據庫。這些庫可以部署在不同的服務器,分攤訪問壓力。

★ 業務場景項目裏面單個數據庫的CPU、內存⻓期處於90%+的利⽤率,數據庫連接經常不夠,需要進⾏優化。

☝ 拆分原則對一個系統中的不同業務進行拆分, 數據庫的連接資源比較寶貴且單機處理能力也有限。

▶ 舉個例子現有數據庫1、數據庫2,並且有訂單表和商品評論表。根據業務場景的不同,將訂單表存儲在數據庫1中,而商品評論表存儲在數據庫2中。

3、水平分表
水平分表:將一張表的數據(按照數據行) ,分配到同一個數據庫的多張表中,每個表都只有一部分數據,表結構一樣數據不⼀樣。

★ 業務場景當⼀張表的數據達到⼏千萬時,查詢⼀次所花的時間長速度慢,需要進⾏優化,縮短查詢時間。

☝ 拆分原則大表拆小表(垂直分表:表結構拆分;⽔平分表:數據拆分),把⼀個表的數據分到⼀個數據庫的多張表中,每個表只有這個表的部分數據。

▶ 舉個例子現有數據庫1,在數據庫1中有多個訂單表order1、order2,分表規則通過id對2取餘,訂單id沒有餘數的訂單數據存order1表中,訂單號有餘數的訂單數據存儲在order2表中,訂單表1中的數據 + 訂單表2中的數據纔是全部的訂單數據。

4、水平分庫
將一張表的數據(按照數據行) 分到多個不同的數據庫。每個庫的表結構相同,數據不相同沒有交集。水平分庫比水平分表的粒度更大。

★ 業務場景:高併發的項目中,水平分表後訪問壓力依舊在單個庫上,1個數據庫資源瓶頸 CPU/內存/帶寬等限制導致響應慢,需要進行優化。

☝ 拆分原則把同個表的數據按照⼀定規則分到不同的數據庫中。

▶ 舉個例子:現有數據庫1、數據庫2,並且兩個數據庫中都有order訂單表。根據分表規則通過id對2取餘,訂單id沒有餘數的訂單數據存在數據庫1的order表中,訂單號有餘數的訂單數據存儲在數據庫2的order表中。

5、分表分庫所帶來的問題

  • 跨節點數據庫Join關聯查詢和多維度查詢;
  • 分庫操作帶來的分佈式事務問題;
  • 執行SQL排序、分頁、函數計算等問題;
  • 數據庫全局主鍵重複問題;
  • 分庫分表後⼆次擴容問題;
  • 分庫分表技術選型問題。

解決舊問題,又來新問題。問題5需要怎麼解決呢,這就用到了分庫分表中間件,今天就找到了一個,有機會要用起來。

SpringBoot + Sharding JDBC 分庫分表

最 後 總 結

數據庫的優化,一般是遇到什麼問題就解決什麼問題。平時編碼的時候,需要注意sql優化和程序優化。單個數據庫的優化達到瓶頸,就需要考慮主從庫讀寫分離,甚至分庫分表。分庫分表需要找一個可靠的中間件來幫忙。如果是從0開始的項目,最好在設計數據庫之初就根據業務場景來考慮這些問題。

以上便是我的調查,希望對你有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章