1. 程式人生 > >資料庫MySQL調優

資料庫MySQL調優

一、架構層面

1、做主從複製。
2、實現讀寫分離。
3、分庫分表。

二、系統層面

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 足夠。