1. 程式人生 > >mysql 優化學習一

mysql 優化學習一

影響資料庫的因素

  1. 伺服器硬體效能
  2. 磁碟IO
  3. sql查詢速度
  4. 網絡卡流量
QPS: 每秒鐘處理的查詢量
TPS: 每秒鐘處理的事務數
併發量:同一時刻所需要資料伺服器做處理的請求的數量
連線量:往往要比並髮量大得多,是客戶端與資料庫伺服器建立的連結數量

超高的QPS 和 TPS

10ms 處理一個sql => 1s 處理 100個sql => QPS => 100
100ms處理一個sql => 1s 處理 10 個sql => QPS => 10

資料庫效能 80%是由於慢查詢引起的,即大部分的資料庫效能問題可以通過sql優化來解決。

大量的併發和超高的CPU使用率所帶來的風險

  1. 大量的併發:資料庫連線數被沾滿(max_connection預設100)
  2. 超高的CPU使用率:因CPU資源耗盡而出現宕機

磁碟IO

資料庫的只要瓶頸

  1. 磁碟IO效能突然下降(熱資料遠遠大於伺服器可用記憶體=>使用更快的磁碟裝置)
  2. 其他大量的消耗磁碟效能的計劃任務(調整計劃任務、做好磁碟維護)

網絡卡流量

  • 網絡卡IO被沾滿(1000Mb/8 ≈ 100MB)
    1. 減少從伺服器的數量
    2. 進行分級快取
    3. 避免使用select * 進行查詢
    4. 分離業務網路和伺服器網路

大表帶來的問題

什麼是大表:

1. 記錄行數巨大,單表超過千萬行
2. 表資料檔案巨大,表資料檔案超過10G

大表對查詢的影響:

慢查詢:很難再一定的時間內過濾出所需的資料

大表對DDL的影響:

1. 建立索引需要很長的時間
    1). Mysql版本<5.5 建立索引會鎖表
    2). Mysql版本>=5.5 雖然不會鎖表,但會引起主從延遲
2. 修改表結構需要長時間鎖表
    1). 會造成長時間的主從延遲
    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操作