MySQL 數據庫的使用是非常的廣泛,穩定性和安全性也非常好,經歷了無數大小公司的驗證。僅能夠安裝使用是遠遠不夠的,MySQL 在使用中需要進行不斷的調整參數或優化設置,才能夠發揮 MySQL 的最大作用。下邊的內容是我在工作中經驗的總結,也作為自己的工作筆記,如果能夠幫助到有需要的同志就更好了。MySQL 的優化可以從個方面來做:
一、架構層面
1、做主從復制。
2、實現讀寫分離。
二、系統層面
1、增加內存。
2、硬盤使用固態硬盤 SSD。
3、給磁盤做 raid0 或者 raid5 以增加磁盤的讀寫速度。
4、可以重新掛載磁盤,並加上 noatime 參數,這樣可以減少磁盤的 I/O。
三、MySQL本身的優化
1、如果未配置主從同步,可以把 bin-log 功能關閉,減少磁盤 I/O。
2、在 my.cnf 中加上 skip-name-resolve ,這樣可以避免由於解析主機名延遲造成 M有SQL 執行慢。
3、調整幾個關鍵的 buffer 和 cache。調整的依據,主要根據數據庫的狀態來調試。如何調優可以參考五。
4、根據具體的使用場景,選擇合適的存儲引擎。
四、應用層次
查看慢查詢日志,根據慢查詢日志優化程序中的 SQL 語句,比如增加索引
五、調整關鍵的buffer和cache
1、key_buffer_size
首先可以根據系統的內存大小設定它,大概的一個參考值:1G以下內存設定 128M;2G/256M; 4G/384M; 8G/1024M;16G/2048M。這個值可以通過檢查狀態值 Key_read_requests 和 Key_reads,可以知道 key_buffer_size 設置是否合理。比例 key_reads / key_read_requests 應該盡可能的低,至少是 1:100,1:1000更好(上述狀態值可以使用 SHOW STATUS LIKE 'key_read%' 獲得)。注意:該參數值設置的過大反而會是服務器整體效率降低!
2、table_open_cache
打開一個表的時候,會臨時把表裡面的數據放到這部分內存中,一般設置成 1024 就夠了,它的大小我們可以通過這樣的方法來衡量: 如果你發現 open_tables 等於 table_cache,並且 opened_tables 在不斷增長,那麼你就需要增加 table_cache 的值了(上述狀態值可以使用 SHOW STATUS LIKE 'Open%tables' 獲得)。注意,不能盲目地把 table_cache 設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。
3、sort_buffer_size
查詢排序時所能使用的緩沖區大小,該參數對應的分配內存是每連接獨占! 如果有 100 個連接,那麼實際分配的總共排序緩沖區大小為100 × 4 = 400MB。所以,對於內存在 4GB 左右的服務器推薦設置為:4-8M。
4、read_buffer_size
讀查詢操作所能使用的緩沖區大小。和 sort_buffer_size 一樣,該參數對應的分配內存也是每連接獨享!
5、join_buffer_size
聯合查詢操作所能使用的緩沖區大小,和 sort_buffer_size 一樣,該參數對應的分配內存也是每連接獨享!
6、myisam_sort_buffer_size
這個緩沖區主要用於修復表過程中排序索引使用的內存或者是建立索引時排序索引用到的內存大小,一般 4G 內存給 64M 即可。
7、query_cache_size
MySQL查詢操作緩沖區的大小,通過以下做法調整:SHOW STATUS LIKE ‘Qcache%’; 如果Qcache_lowmem_prunes該參數記錄有多少條查詢因為內存不足而被移除出查詢緩存。通過這個值,用戶可以適當的調整緩存大小。如果該值非常大,則表明經常出現緩沖不夠的情況,需要增加緩存大小Qcache_free_memory:查詢緩存的內存大小,通過這個參數可以很清晰的知道當前系統的查詢內存是否夠用,是多了,還是不夠用,我們可以根據實際情況做出調整。一般情況下 4G 內存設置 64M 足夠了。
8、thread_cache_size
表示可以重新利用保存在緩存中線程的數,參考如下值:1G —> 8; 2G —> 16; 3G —> 32; 3G —> 64
除此之外,還有幾個比較關鍵的參數
9、thread_concurrency
這個值設置為 CPU 核數的2倍即可。
10、wait_timeout
表示空閒的連接超時時間,默認是:28800s,這個參數是和 interactive_timeout 一起使用的,也就是說要想讓 wait_timeout 生效,必須同時設置 interactive_timeout,建議他們兩個都設置為10。
11、max_connect_errors
是一個 MySQL 中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。與性能並無太大關系。為了避免一些錯誤我們一般都設置比較大,比如說10000。
12、max_connections
最大的連接數,根據業務請求量適當調整,設置 500 足夠。
13、max_user_connections
是指同一個賬號能夠同時連接到 mysql 服務的最大連接數。設置為 0 表示不限制。通常我們設置為 100 足夠。
----- 待更新 -----
http://www.bkjia.com/Linuxjc/1193612.html TechArticle