mysql 優化學習一
阿新 • • 發佈:2019-01-24
影響資料庫的因素
- 伺服器硬體效能
- 磁碟IO
- sql查詢速度
- 網絡卡流量
QPS: 每秒鐘處理的查詢量
TPS: 每秒鐘處理的事務數
併發量:同一時刻所需要資料伺服器做處理的請求的數量
連線量:往往要比並髮量大得多,是客戶端與資料庫伺服器建立的連結數量
超高的QPS 和 TPS
10ms 處理一個sql => 1s 處理 100個sql => QPS => 100
100ms處理一個sql => 1s 處理 10 個sql => QPS => 10
資料庫效能 80%是由於慢查詢引起的,即大部分的資料庫效能問題可以通過sql優化來解決。
大量的併發和超高的CPU使用率所帶來的風險
- 大量的併發:資料庫連線數被沾滿(max_connection預設100)
- 超高的CPU使用率:因CPU資源耗盡而出現宕機
磁碟IO
資料庫的只要瓶頸
- 磁碟IO效能突然下降(熱資料遠遠大於伺服器可用記憶體=>使用更快的磁碟裝置)
- 其他大量的消耗磁碟效能的計劃任務(調整計劃任務、做好磁碟維護)
網絡卡流量
- 網絡卡IO被沾滿(1000Mb/8 ≈ 100MB)
- 減少從伺服器的數量
- 進行分級快取
- 避免使用select * 進行查詢
- 分離業務網路和伺服器網路
大表帶來的問題
什麼是大表:
1. 記錄行數巨大,單表超過千萬行
2. 表資料檔案巨大,表資料檔案超過10G
大表對查詢的影響:
慢查詢:很難再一定的時間內過濾出所需的資料
大表對DDL的影響:
1. 建立索引需要很長的時間
1). Mysql版本<5.5 建立索引會鎖表
2). Mysql版本>=5.5 雖然不會鎖表,但會引起主從延遲
2. 修改表結構需要長時間鎖表
1). 會造成長時間的主從延遲
2). 影響正常的資料操作(會阻塞)
如何處理資料庫中的大表問題
分庫分表把一張大表分成多個小表
難點: 分表主鍵的選擇 分表後跨分割槽資料的查詢和統計
大表的歷史資料歸檔(減少對前後端業務的影響)
難點: 歸檔時間點的選擇 如何進行歸檔操作
大事務帶來的問題
1. 事務是資料庫系統區別與其他一切檔案系統的重要特性之一
2. 事務是一組具有原子性的sql語句,或是一個獨立執行的單元
3. 事務需要符合的四大特性:①原子性(ATOMICITY) ②一致性 (CONSISTENCY)③ 隔離性 (ISOLATION)④永續性
定義:一個事務必須是一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗,對於一個事務來說,不可能只執行其中的一部分操作
事務原子性(ATOMICITY):整個事務要麼全部提交成功,要麼全部失敗回滾
事務一致性(CONSISTENCY):一致性是指將資料庫從一種一致性狀態轉換到另一種一致性狀態,在事務開始之前和事務結束後資料庫中資料的完整性沒有被破壞
事務隔離性(ISOLATION):隔離性要求一個事務對資料庫中資料的修改,在未提交完成前對於其他事務是不可見的
SQL標準中定義了四中隔離級別:(隔離性由低到高,併發性有高到低)
1. 未提交讀(READ UNCOMMITED),會產生髒讀
2. 已提交讀(READ COMMITTED)
3. 可重複讀(REPEATABLE READ)
4. 可序列化(SERIALIZABLE)
事務永續性(DURABILITY):一旦事務提交,則其所做的修改就會永久儲存到資料庫中,此時系統崩潰,已提交的修改資料也不會丟失。
mysql檢視隔離級別:show variables like '%iso%';
mysql修改隔離級別:(可選引數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.)
①修改mysql.ini:
[mysqld]
transaction-isolation = REPEATABLE-READ
②客戶端修改:
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
innodb預設的隔離級別是可重複度(REPEATABLE READ)
所謂的大事務就是:執行時間比較長,操作資料比較多的事務
問題:
1. 鎖定太多的資料,造成大量的阻塞和鎖超時
2. 回滾需要的時間比較長,會鎖定回滾所需要的行,所需時間甚至比修改所需時間還要長。
3. 執行時間長,容易造成主從延遲
如何處理大事務:
1. 避免一次處理提多的資料
2. 移出不必要在事務中的SELECT操作