目的
對於不同業務場景,通過在調整數據庫的參數配置,可以有效提升服務器性能。
方法
使用如下配置文件參數啟動數據庫,默認配置文件路徑為/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和數據刷新磁盤的方法:
|
建議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。 |
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,關閉性能模式。 |