1、使用行層級鎖,避免表層級或頁層級鎖
盡量使用支援行層級鎖的儲存引擎,如InnoDB;只在讀操作顯著多於寫作的情境中(如資料倉儲類的應用)使用表層級鎖的儲存引擎,如MyISAM;。
2、降低熱巨鎖(hot gaint lock)出現的可能性以儘可能避免全域互斥量 臨界區(僅允許單一線程訪問的資源)會嚴重降低MySQL系統並發性;InnoDB緩衝池(buffer pool)、資料字典等都是常見的臨界區;幸運的是,新版本的InnoDB已經能夠較好的運行於多核處理器,支援使用innodb_buffer_pool_instances伺服器變數建立多個緩衝池執行個體,每個緩衝池執行個體分別自我管理空閑列表、列表刷寫、LRU以及其它跟緩衝池相關的資料結構,並通過各自的互斥鎖進行保護。
3、並行運行多個I/O線程 通過innodb_io_capacity伺服器變數等增加磁碟I/O線程的數量可以提高前端操作(如SELECT)的效能,不過,磁碟I/O線程的數量不應該超過磁碟的IOPS(7200RPM的單塊硬體的IOPS數量一般為100個左右)。 此外,非同步I/O也可以在一定程度上提高系統的並發能力,在Linux系統上,可以通過將MySQL的伺服器變數innodb_use_native_aio的值設定為ON設定InnoDB可以使用Linux的非同步I/O子系統。
4、並行後端任務 預設情況下,MySQL的清寫(purge)操作(用於移除帶刪除標記的記錄)由InnoDB的主線程完成,這可以降低內部資源競爭發生的機率,進而增強MySQL服務伸縮能力。不過,隨著InnoDB內部各式各樣的競爭越來越多,這種設定帶來的效能優勢已幾乎不值一提,因此,生產環境中應該通過為innodb_purge_threads伺服器變數設定為ON將主線程與清寫線程分開運行。
5、單線程複製模型中的SQL線程是一個熱區 在從伺服器上並行運行多個SQL線程可有效提高MySQL從伺服器效能,MySQL 5.6支援多線程複製(每庫一個複製線程);
本文出自 “馬哥教育” 部落格,轉載請與作者聯絡!