MySQL性能調優配置


目的

對於不同業務場景,通過在調整數據庫的參數配置,可以有效提升服務器性能。

方法

使用如下配置文件參數啟動數據庫,默認配置文件路徑為/etc/my.cnf, 其中MySQL軟件安裝及數據存放路徑根據實際情況修改。

[mysqld_safe]
log-error=/data/mysql/log/mariadb.log
pid-file=/data/mysql/run/mysqld.pid

[client]
socket=/data/mysql/run/mysql.sock
default-character-set=utf8

[mysqld]
basedir=/usr/local/mysql
tmpdir=/data/mysql/tmp
datadir=/data/mysql/data
socket=/data/mysql/run/mysql.sock
port=3306
user=root
default_authentication_plugin=mysql_native_password
ssl=0 #關閉ssl
max_connections=2000  #設置最大連接數
back_log=2048  #設置會話請求緩存個數
performance_schema=OFF #關閉性能模式
max_prepared_stmt_count=128000

#file
innodb_file_per_table #設置每個表一個文件
innodb_log_file_size=1500M #設置logfile大小
innodb_log_files_in_group=32 #設置logfile組個數
innodb_open_files=4000 #設置最大打開表個數

#buffers
innodb_buffer_pool_size=230G #設置buffer pool size,一般為服務器內存60%
innodb_buffer_pool_instances=16 #設置buffer pool instance個數,提高並發能力
innodb_log_buffer_size=64M #設置log buffer size大小

#tune
sync_binlog=1 #設置每次sync_binlog事務提交刷盤
innodb_flush_log_at_trx_commit=1 #每次事務提交時MySQL都會把log buffer的數據寫入log file,並且flush(刷到磁盤)中去
innodb_use_native_aio=1 #開啟異步IO
innodb_spin_wait_delay=180 #設置spin_wait_delay 參數,防止進入系統自旋
innodb_sync_spin_loops=25  #設置spin_loops 循環次數,防止進入系統自旋
innodb_flush_method=O_DIRECT #設置innodb數據文件及redo log的打開、刷寫模式
innodb_io_capacity=20000 # 設置innodb 后台線程每秒最大iops上限
innodb_io_capacity_max=40000 #設置壓力下innodb 后台線程每秒最大iops上限
innodb_lru_scan_depth=9000 #設置page cleaner線程每次刷臟頁的數量
innodb_page_cleaners=16  #設置將臟數據寫入到磁盤的線程數

#perf special
innodb_flush_neighbors=0 #檢測該頁所在區(extent)的所有頁,如果是臟頁,那么一起進行刷新,SSD關閉該功能
innodb_write_io_threads=16 #設置寫線程數
innodb_read_io_threads=16 #設置讀線程數
innodb_purge_threads=32  #設置回收已經使用並分配的undo頁線程數

sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO,STRICT_ALL_TABLES
 

參數名稱

參數含義

優化建議

innodb_thread_concurrency

InnoDB使用操作系統線程來處理用戶的事務請求。

建議取默認值為0,它表示默認情況下不限制線程並發執行的數量。

innodb_read_io_threads

執行請求隊列中的讀請求操作的線程數。

根據CPU核數及讀寫比例進一步更改來提高性能。

innodb_write_io_threads

執行請求隊列中的寫請求操作的線程數。

根據CPU核數及讀寫比例進一步更改來提高性能。

query_cache_size

設置query_cache_size大小。

Query Cache(查詢緩存)是一個眾所周知的瓶頸位,即使在並發量不高的時候也會出現。最好的選擇是從一開始就禁用它。通過設置 query_cache_size = 0,建議禁用查詢緩存。

innodb_buffer_pool_instances

開啟多個內存緩沖池,把需要緩沖的數據hash到不同的緩沖池中,這樣可以並行的內存讀寫。

建議設置8~16。

innodb_open_files

在innodb_file_per_table模式下,限制Innodb能打開的文件數量。

建議此值調大一些,尤其是表特別多的情況。

innodb_buffer_pool_size

緩存數據和索引的地方。

通常建議內存的70%左右。

innodb_log_buffer_size

緩存重做日志。

默認值是64M,建議通過查看innodb_log_wait,調整innodb_log_buffer_size大小。

innodb_io_capacity

innodb 后台線程每秒最大iops上限。

建議為IO QPS總能力的75%。

innodb_log_files_in_group

重做日志組的個數。

-

innodb_log_file_size

重做日志文件大小。

如果存在大量寫操作,建議增加日志文件大小,但日志文件過大,會影響數據恢復時間。

如果是非生產環境,測試極限性能時,盡量調大日志文件。

如果是商用場景,需要考慮數據恢復時間,綜合折中后設置日志文件大小。

innodb_flush_method

Log和數據刷新磁盤的方法:

  1. datasync模式:寫數據時,write這一步並不需要真正寫到磁盤才算完成(可能寫入到操作系統buffer中就會返回完成),真正完成是flush操作,buffer交給操作系統去flush,並且文件的元數據信息也都需要更新到磁盤。
  2. O_DSYNC模式:寫日志操作是在write這步完成,而數據文件的寫入是在flush這步通過fsync完成。
  3. O_DIRECT模式:數據文件的寫入操作是直接從mysql innodb buffer到磁盤的,並不用通過操作系統的緩沖,而真正的完成也是在flush這步,日志還是要經過OS緩沖。

建議O_DIRECT模式。

innodb_spin_wait_delay

控制輪詢的間隔。

根據真實場景調試,直到看不到splin_lock熱點函數等。

innodb_sync_spin_loops

控制輪詢的虛幻次數。

根據真實場景調試,直到看不到splin_lock熱點函數等。

innodb_lru_scan_depth

LRU列表的可用頁數量。

默認值是1024,非生產環境,測試極限性能可以適當調大,減少checkpoint次數。

innodb_page_cleaners

刷新臟數據的線程數。

建議與innodb_buffer_pool_instances相等。

innodb_purge_threads

回收undo的線程數。

-

innodb_flush_log_at_trx_commit

  • 0:不管有沒有提交,每秒鍾都寫到binlog日志里.
  • 1:每次提交事務,都會把log buffer的內容寫到磁盤里去,對日志文件做到磁盤刷新,安全性最好。
  • 2:每次提交事務,都寫到操作系統緩存,由OS刷新到磁盤,性能最好。

非生產環境,測試極限性能,可以設置為0。

innodb_doublewrite

是否開啟二次寫。

非生產環境,測試極限性能,可以設置為0,關閉二次寫。

ssl

是否開啟安全連接。

安全連接對性能影響較大,非生產環境,測試極限性能,可以設置為0;商用場景,根據客戶需求調整。

skip_log_bin

是否開啟binlog。

非生產環境,測試極限性能在參數文件中增加此參數,關閉binlog選項。

innodb_checksum_algorithm

數據完整性校驗。

非生產環境,測試極限性能設置成none,不啟用算法校驗。

binlog_checksum

Binlog完整性校驗。

非生產環境,測試極限性能設置成none,不啟用算法校驗。

innodb_log_checksums

Log完整性校驗。

非生產環境,測試極限性能設置成0,關閉log checksum。

foreign_key_checks

外鍵校驗。

非生產環境,測試極限性能設置成0,關閉外鍵校驗。

performance_schema

是否開啟性能模式。

非生產環境,測試極限性能設置為OFF,關閉性能模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM