MySQL提高性能參數(shù)配置的方法
1. InnoDB緩沖池大?。耗愕臄?shù)據(jù)“內(nèi)存”有多大?
問題在哪?
默認(rèn)的innodb_buffer_pool_size通常是128MB。如果數(shù)據(jù)庫(kù)有10GB數(shù)據(jù),MySQL要像蝸牛一樣從磁盤慢慢讀,這能不慢嗎?
解決方案:
這個(gè)參數(shù)定義了InnoDB存儲(chǔ)引擎用來緩存表數(shù)據(jù)和索引的內(nèi)存區(qū)域大小。在專用數(shù)據(jù)庫(kù)服務(wù)器上,建議設(shè)置為物理內(nèi)存的70%~80%。這是MySQL性能優(yōu)化的第一要?jiǎng)?wù),沒有之一。
實(shí)操代碼:
假設(shè)你的服務(wù)器是64GB內(nèi)存,打開MySQL配置文件(my.cnf 或 my.ini):
[mysqld] innodb_buffer_pool_size = 50G # 如果是MySQL 8.0,建議同時(shí)設(shè)置實(shí)例數(shù),減少鎖爭(zhēng)用 innodb_buffer_pool_instances = 8 # 每個(gè)實(shí)例至少1GB,所以50G/8≈6.25G,完全OK
驗(yàn)證效果:
重啟MySQL后,執(zhí)行:
SHOW ENGINE INNODB STATUS\G
查看緩沖池命中率,如果Buffer pool hit rate 長(zhǎng)期低于99%,說明內(nèi)存給得還不夠,或者索引有問題。
2. 事務(wù)日志刷盤策略:要命的安全感,還是極致的速度?
問題在哪?
默認(rèn)值
innodb_flush_log_at_trx_commit = 1,代表每次事務(wù)提交都要把日志寫到磁盤。這是最安全的,但也最慢,因?yàn)榇疟PI/O是致命的延遲。
解決方案:
如果你的業(yè)務(wù)允許丟失最后一秒內(nèi)的數(shù)據(jù)(比如日志、點(diǎn)贊數(shù)、非金融類業(yè)務(wù)),請(qǐng)果斷改為2。
設(shè)置為2,意味著每次事務(wù)提交只寫入操作系統(tǒng)緩存,然后每秒才真正刷新到磁盤。性能提升立竿見影。
實(shí)操代碼:
[mysqld] # 0: 每秒寫入磁盤,性能最高,安全性最低 # 1: 每次提交都寫入磁盤,性能最低,安全性最高(默認(rèn)) # 2: 每次提交寫入操作系統(tǒng)緩存,每秒刷盤,性能與安全的折中 innodb_flush_log_at_trx_commit = 2
血淚教訓(xùn):
曾經(jīng)幫一個(gè)游戲公司調(diào)優(yōu),把訂單系統(tǒng)的這個(gè)參數(shù)從1改成2后,TPS直接從800飆到了3500。雖然他們承擔(dān)了斷電丟數(shù)據(jù)的微小風(fēng)險(xiǎn),但游戲體驗(yàn)絲滑多了。切記,錢包交易相關(guān)的庫(kù)別亂改這個(gè)!
3. 磁盤I/O能力上限:別讓你的SSD當(dāng)機(jī)械盤用
問題在哪?
innodb_io_capacity 這個(gè)參數(shù)告訴InnoDB你的磁盤有多快。默認(rèn)是200,這是針對(duì)老式機(jī)械硬盤的。現(xiàn)在的NVMe SSD隨便都能到幾萬(wàn)的IOPS。如果不改,MySQL的后臺(tái)刷新臟頁(yè)就像老爺車跑高速,永遠(yuǎn)在堵車。
解決方案:
根據(jù)你的磁盤性能,把這個(gè)值調(diào)高。
實(shí)操代碼:
[mysqld] # 如果是普通的SATA SSD innodb_io_capacity = 2000 innodb_io_capacity_max = 4000 # 如果是頂尖的NVMe SSD,可以更大膽 # innodb_io_capacity = 5000 # innodb_io_capacity_max = 10000
為什么有效?
調(diào)高后,InnoDB能更積極地刷新臟頁(yè),避免臟頁(yè)堆積。當(dāng)數(shù)據(jù)庫(kù)突然空閑時(shí),它能更快地把內(nèi)存中的臟數(shù)據(jù)寫回磁盤,為下一次高峰做好準(zhǔn)備。
4. 連接數(shù)管理與超時(shí):別讓死連接占著茅坑不拉屎
問題在哪?
max_connections 默認(rèn)值151,高并發(fā)瞬間就會(huì)打滿。同時(shí),wait_timeout 默認(rèn)28800秒(8小時(shí)),很多程序?qū)懲闟QL不釋放連接,導(dǎo)致連接被僵尸連接耗盡。
解決方案:
合理設(shè)置最大連接數(shù),并大幅降低超時(shí)時(shí)間。
實(shí)操代碼:
[mysqld] # 根據(jù)你的服務(wù)器內(nèi)存和線程數(shù)調(diào)整,一般幾百到一千足夠 max_connections = 500 # 交互式連接超時(shí)(如命令行),非交互式連接(如JDBC)超時(shí) # 設(shè)置5分鐘,讓空閑連接趕緊滾蛋 wait_timeout = 300 interactive_timeout = 300
避坑指南:
max_connections不是越大越好。每一個(gè)連接都需要消耗線程和內(nèi)存。如果你設(shè)置5000個(gè)連接,內(nèi)存瞬間爆掉。配合thread_cache_size使用,建議設(shè)置為8~64,減少線程創(chuàng)建銷毀的開銷。
5. 緩存池預(yù)熱:別讓數(shù)據(jù)庫(kù)重啟后“冷啟動(dòng)”
問題在哪?
數(shù)據(jù)庫(kù)重啟后,innodb_buffer_pool 里空空如也。業(yè)務(wù)一開始查詢,全得去磁盤讀,這叫“冷啟動(dòng)”階段,性能慘不忍睹。
解決方案:
MySQL 5.6及以后版本支持在關(guān)閉時(shí)dump(轉(zhuǎn)儲(chǔ))出緩沖池中的頁(yè)號(hào),啟動(dòng)時(shí)再load(加載)回來,讓數(shù)據(jù)庫(kù)一啟動(dòng)就處于“熱”狀態(tài)。
實(shí)操代碼:
[mysqld] # 記錄緩沖池中最近使用的頁(yè)(占百分比) innodb_buffer_pool_dump_at_shutdown = ON # 啟動(dòng)時(shí)加載之前dump的頁(yè),預(yù)熱緩沖池 innodb_buffer_pool_load_at_startup = ON # dump的頁(yè)百分比,建議設(shè)置為 25 或更高 innodb_buffer_pool_dump_pct = 40
總結(jié)
很多時(shí)候,我們遇到數(shù)據(jù)庫(kù)慢,第一反應(yīng)是加硬件、改代碼。但其實(shí)最基礎(chǔ)的往往最致命。
調(diào)整 innodb_buffer_pool_size 給足內(nèi)存,設(shè)置
innodb_flush_log_at_trx_commit=2 減少等待,調(diào)高 innodb_io_capacity 釋放SSD性能,收短 wait_timeout 清理門戶,最后用 dump 和 load 實(shí)現(xiàn)重啟即巔峰。
把這5個(gè)配置改完,你的數(shù)據(jù)庫(kù)才算是穿上了跑鞋。去試試吧,效果立竿見影!如果你的數(shù)據(jù)庫(kù)版本較老(如MySQL 5.6以下),有些參數(shù)可能不支持,建議至少升級(jí)到5.7或8.0,這些新版本自帶的性能優(yōu)化會(huì)讓你驚喜。
到此這篇關(guān)于MySQL提高性能參數(shù)配置的方法的文章就介紹到這了,更多相關(guān)mysql性能參數(shù)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL性能參數(shù)詳解之Skip-External-Locking參數(shù)介紹
- MySQL性能參數(shù)詳解之Max_connect_errors 使用介紹
- MySQL性能優(yōu)化之Open_Table配置參數(shù)的合理配置建議
- MySQL性能優(yōu)化之table_cache配置參數(shù)淺析
- MySQL性能優(yōu)化之max_connections配置參數(shù)淺析
- MySQL性能優(yōu)化配置參數(shù)之thread_cache和table_cache詳解
- 影響MySQL性能的五大配置參數(shù)
- mysql配置連接參數(shù)設(shè)置及性能優(yōu)化
- MySQL性能全面優(yōu)化方法參考,從CPU,文件系統(tǒng)選擇到mysql.cnf參數(shù)優(yōu)化
相關(guān)文章
在Qt中操作MySQL數(shù)據(jù)庫(kù)的實(shí)戰(zhàn)指南
QT連接Mysql數(shù)據(jù)庫(kù)的步驟相對(duì)繁瑣,但是也是一個(gè)不錯(cuò)的學(xué)習(xí)經(jīng)歷,下面這篇文章主要給大家介紹了關(guān)于在Qt中操作MySQL數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
MySql總彈出mySqlInstallerConsole窗口的解決方法
這篇文章主要介紹了MySql總彈出mySqlInstallerConsole窗口的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
MySQL中show命令方法得到表列及整個(gè)庫(kù)的詳細(xì)信息(精品珍藏)
MySQL中show 句法得到表列及整個(gè)庫(kù)的詳細(xì)信息,方便查看數(shù)據(jù)庫(kù)的詳細(xì)信息。2010-11-11
運(yùn)用mysqldump 工具時(shí)需要注意的問題
用mysqldump 導(dǎo)出 Trigger 的時(shí)候遇到一個(gè)問題,貼出來,以免大家犯錯(cuò)。2009-07-07
Mysql通過Adjacency List(鄰接表)存儲(chǔ)樹形結(jié)構(gòu)
本片介紹MYSQL存儲(chǔ)樹形結(jié)構(gòu)的一種方法,通過Adjacency List來實(shí)現(xiàn),一起來學(xué)習(xí)下。2017-12-12

