MySQL分表分庫&讀寫分離相關
MySQL架構優化
1.分表
當專案上線後,資料將會幾何級的增長,當資料很多的時候,讀取效能將會下降,更新表資料的時候也需要更新索引,所以我們需要分表,當資料量再大的時候就需要分庫了。
a.水平拆分:資料分成多個表
b.垂直拆分:欄位分成多個表
c.插入/更新/刪除資料和查詢統計 MyISAM儲存引擎有一個MERGE儲存引擎,可以將多個表合成一個表,就可以進行這四種操作 InnoDB用alter able可以將變成MyISAM儲存引擎,然後使用MERGE引擎
面試題:MERGE儲存引擎將N個子表合併,那麼在資料庫中如何儲存?
答案:MERGE是將N個真實的表組成一個大表,但是實際上還是儲存的
2.讀寫分離
當資料不斷增多的時候,資料庫壓力增大,可以把讀和寫分離開,讀是一些機器,寫是另一些機器,對應主從伺服器,主伺服器是寫操作,從伺服器讀操作,可以有多個從伺服器,而且大多數業務是讀操作,京東,淘寶大量瀏覽商品,是讀操作。
在主伺服器寫的同時,資料同步到從伺服器,保持資料的完整性(主從複製)
主從複製的原理:基於主伺服器的二進位制日誌(binlog)跟蹤所有的對資料庫的完整更改實現。因此,要實現主從複製,必須在主伺服器上啟動二進位制日誌。
主從複製是非同步複製,所以有三個執行緒參與。主伺服器一個執行緒(IO執行緒) 從伺服器兩個(IO執行緒和SQL執行緒)
主從複製的過程:
1)從資料庫執行一個start slave開啟主從複製
2)從資料庫的IO執行緒會通過主資料庫授權的使用者請求連線主資料庫,並請求主資料庫的binlog日誌指定位置 指定的命令為change master
3)主資料庫收到IO請求,負責複製的IO執行緒根據請求讀取指定的binlog檔案資訊,返回給從資料庫IO執行緒,返回的資訊除了日誌檔案,還有本次返回的日誌內容和binlog名稱和位置,binlog名稱和位置會寫在master-info檔案中
4)從資料庫獲取內容和位置(binlog),寫入到relaylog(從資料庫)中繼日誌的最末端,並將新的binlog檔名和位置記錄到Master-info
5)從資料庫的SQL執行緒實時監測本地relaylog新增內容,解析為SQL語句執行
主從複製的弊端-->延遲的解決方案:
1.定位問題-->找到延遲瓶頸(是IO壓力大-->升級硬體/換成SSD(固態硬碟))
2.單執行緒從relaylog執行MySQL語句延遲-->使用MySQL5.6以上版本多執行緒或者Tungsten第三方並行複製
3.若都不行,則直接分庫
3.分庫
很早以前是使用Cobar方案(阿里開源但後續沒有更新)
現在是使用MyCat,他是基於Cobar,使用的是MySQL通訊協議實現了分庫,是一個代理伺服器,不是普通的Web代理伺服器,而是在應用伺服器和後臺資料庫之間,有一個特性是無狀態,容易部署負載均衡
原理:應用伺服器傳SQL語句-->路由解析轉發到不同的後臺資料庫-->結果彙總返回
叢集分散式模型:
(負載均衡一般使用在:網路優化/單點登入/叢集分散式/高併發)
MyCat把邏輯資料庫和資料表對應到真實的資料庫和資料表,因此開發者只需要關心邏輯上的相關操作就行了,遮蔽了物理差異性
MyCat影射關係圖:
MyCat工作流程;
1.應用伺服器向MyCat傳送SQL語句:select * from user where id in(30,31,32)
2.MyCat前端通訊模組與應用伺服器通訊,交給SQL解析模組
3.SQL解析模組解析完交給SQL路由模組
4.SQL路由模組id取模,餘數為0,是db1,餘數為1,是db2,以此類推
5.把SQL拆解為select * from user where id in (30,31,32),交給SQL執行模組對應db1,db2,db3...
6.SQL執行模組通過後端分別在db1,db2,db3...執行語句,返回結果到資料集合並模組,然後返回給應用伺服器
4.慢查詢分析 調引數
慢查詢:指的是執行超過一定時間SQL查詢語句,把這個記錄到慢查詢日誌,方便開發人員看日誌找問題。
主要是三個引數:long_query_time 定義慢查時間 slow_query_log 設定慢查詢開關 slow_query_log_file 設定慢查詢日誌檔案路徑
配置慢查詢方法:
方法1:
set long_query_time=1;
set slow_query_log=on;
set slow_query_log_file=’/data/slow.log’;
方法2:
/etc/my.conf設定引數開啟慢查詢,使用explain命令分析SQL,輸出結果含義官方文件有
5.其他優化總結
1.優化查詢
a.使用explain分析
b.索引對查詢速度的影響(注意like關鍵字、多列索引、OR關鍵字,見本人的另一篇文章MySQL的概述及其優化)
2.優化資料庫結構
1.分表
2.增加中間表
3.優化多表查詢