1. 程式人生 > >MySQL 管理之道讀書總結

MySQL 管理之道讀書總結

最近讀了《MySQL 管理之道》一書,做了以下總結,希望對大家有所幫助。在這裡非常感謝作者的辛勤付出。

  1. 影響 MySQL 效能的因素:
        影響 MySQL InnoDB 引擎效能的最主要因素就是磁碟 I/ O,目前磁碟都是機械方式運作的,主要體現在讀寫前尋找磁軌的過程中。因此在單塊磁碟遇到了I/ O瓶頸時,可以把磁碟升級為 RAID 或 SSD 固態硬碟來提升效能,
        影響MySQL InnoDB 引擎效能的另一個因素就是記憶體,InnoDB 引擎在設計之初就是考慮用於大型、高負荷、高併發生產環境的,因此記憶體的大小直接反映了資料庫的效能好壞。在 Buffer_ Pool 緩衝池中,涉及的引數為 innodb_ buffer_ pool_ size,它是 InnoDB 引擎中最重要的引數之一, 對 InnoDB 的效能有決定性的影響。預設的設定只有8MB,將其設定為60%~ 80%的記憶體。

  2. 運維工作中常用的效能分析工具:
    vmstat, sar, iostat, netstat,free, ps, top, mpstat.
    推薦 Linux 伺服器效能監控工具:dstat。collectl 以及淘寶開源監控專案Tsar等。

  3. 在 MySQL5.6裡,提供了快速預熱Buffer_Pool緩衝池,只需要在 my.cnf 加入以下命令:
    innodb_ buffer_ pool_ dump_ at_ shutdown = 1
    解釋:在關閉時把熱資料 dump 到本地磁碟。
    innodb_ buffer_ pool_ dump_ now = 1
    解釋:採用手工方式把熱資料 dump 到本地磁碟。
    innodb_ buffer_ pool_ load_ at_ startup = 1


    解釋:在啟動時把熱資料載入到記憶體。
    innodb_ buffer_ pool_ load_ now = 1
    解釋:採用手工方式把熱資料載入到記憶體。

  4. 驗證主從資料一致性工具:Maatkit 開源工具包。其中mk-table-checksum 是用來檢測 master 和 slave 上的表結構和資料是否一致。mk-table-sync 是在主從資料不一致時,用來修復的。注意,這兩個 perl 指令碼在執行時都會鎖表,表的大小取決於執行的快慢,不要再高峰期間執行,可選擇凌晨。

  5. 軟體部分效能優化主要涉及到資料庫表設計(正規化,欄位型別,儲存引擎),SQL語句與索引,配置檔案引數,作業系統,檔案系統, MysQL版本以及體系架構。

  6. 設計表結構可以滿足第三正規化。但三正規化最大的問題在於查詢時 通常需要 join 很多表,而這會導致查詢效率很低。所以有時候基於效能考慮,我們需要有意違反三正規化,適度地做冗餘,以達到提高查詢效率的目的。 

  7. 欄位型別的選取:主鍵強烈建議用 int 型。省空間,提高效率。根據需求選擇最小整數型別。建表時時間型別優先選擇 timestamp,具有自動更新時間的功能,而且只佔用4位元組。

  8. 線上更改表結構:pt-online-schema-change

  9. MySQL 的鎖具有一下幾種形式:
    表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高, 併發度最低。MyISAM引擎屬於這種型別。
    行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。InnoDB引擎屬於這種型別。
    頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定 粒度界於表鎖和行鎖之間,併發度一般。 NDB 屬於這種型別。
    InnoDB儲存引擎是通過給索引上的索引項加鎖來實現 的,這就意味著:只有通過索引條件檢索資料, InnoDB 才會使用行級鎖,否則, InnoDB 將使用表鎖。

  10. 兩個事務都需要獲得對方持有的排他鎖才能繼續完成事務,這種迴圈鎖等待就是典型的死鎖。發生死鎖後,InnoDB一般都能自動檢測到,它會讓一個事務釋放鎖並回退,另一個事務則獲得鎖,繼續完成事務。死鎖是無法避免的,我們可以通過調整業務的邏輯來儘量減少死鎖出現的概率。

  11. 儘量不要混合使用多種儲存引擎,會帶來複雜的問題。

  12. MyISAM 和 InnoDB之間的主要區別有以下幾點:
    MyISAM是非事務安全型的,而InnoDB是事務安全型的,也就是ACID事務支援;
    MyISAM鎖是表級鎖,鎖開銷最小,而InnoDB支援行級鎖定,鎖管理開銷大,支援更好的併發寫操作;·MyISAM支援全文索引,而InnoDB不支援全文索引,但在最新的5.6版本中已提供支援;
    MyISAM相對簡單,管理方便,因此在效率上要優於InnoDB,小型應用可以考慮使用MyISAM;
    MyISAM表是儲存成檔案的形式,在跨平臺的資料轉移中使用MyISAM儲存會省去不少的麻煩;
    InnoDB表比MyISAM表更安全,可以在保證資料不會丟失的情況下,切換非事務表到事務表。

  13. 事務的概念:ACID

  14. 事務的實現:MySQL在進行事務處理的時候使用的是日誌先行的方式來保證事務可快速和持久執行的,也就是在寫資料前,需要先寫日誌。當開始一個事務時,會記錄該事務的一個LSN日誌序列號;當執行事務時,會往InnoDB_Log_Buffer日誌緩衝區裡插入事務日誌(redolog);當事務提交時,會將日誌緩衝區裡的事務日誌刷入磁碟。這個動作是由innodb_flush_log_at_trx_commit這個引數控制的。

  15. 事務的隔離級別。

  16. 聯合索引遵循最左側原則。
    SQL語句中包含or,不會使用索引,可以用union all 來替代。
    like 如果是模糊匹配,則不能使用索引。如果匹配的字串是以明確的字串開頭的話,是可以的。
    去掉不必要的排序。
    用where子句替換having子句,having子句用於一些集合函式的比較,例如count() 等。
    欄位使用函式,不能用到索引。
    致命的無引號會導致全表掃描,不會用到索引。
    主鍵的長度儘量不要太長;
    固定長度的字元欄位應使用char或nchar型別;
    長度不固定的使用varchar或nvarchar。
    對於可有可無的欄位應儘量提供一個預設值。

  17. 使用 on duplicate key update 解決主鍵衝突判斷,衝突 update,不衝突 insert。

  18. my.cnf配置檔案調優。效能除錯工具tuning-primer.sh

  19. mydumper:一款高效能多執行緒的備份和恢復工具。

  20. oneProxy分庫分表。

  21. Lepus 慢日誌分析平臺。

  22. 讀/寫分離的基本原理是:讓master庫處理事務增、刪、改操作(INSERT、DELETE、UPDATE),而讓slave庫處理SELECT查詢操作,replication資料庫負責把資料變更同步到叢集的slave庫中。