21條MySQL優(yōu)化建議(經(jīng)驗(yàn)總結(jié))
今天一個(gè)朋友向我咨詢?cè)趺慈?yōu)化 MySQL,我按著思維整理了一下,大概粗的可以分為21個(gè)方向。 還有一些細(xì)節(jié)東西(table cache, 表設(shè)計(jì),索引設(shè)計(jì),程序端緩存之類的)先不列了,對(duì)一個(gè)系統(tǒng),初期能把下面做完也是一個(gè)不錯(cuò)的系統(tǒng)。
1. 要確保有足夠的內(nèi)存
數(shù)據(jù)庫(kù)能夠高效的運(yùn)行,最關(guān)建的因素需要內(nèi)存足更大了,能緩存住數(shù)據(jù),更新也可以在內(nèi)存先完成。但不同的業(yè)務(wù)對(duì)內(nèi)存需要強(qiáng)度不一樣,一推薦內(nèi)存要占到數(shù)據(jù)的15-25%的比例,特別的熱的數(shù)據(jù),內(nèi)存基本要達(dá)到數(shù)據(jù)庫(kù)的80%大小。
2. 需要更多更快的CPU
MySQL 5.6可以利用到64個(gè)核,而MySQL每個(gè)query只能運(yùn)行在一個(gè)CPU上,所以要求更多的CPU,更快的CPU會(huì)更有利于并發(fā)。
3. 要選擇合適的操作系統(tǒng)
在官方建議估計(jì)最推薦的是Solaris, 從實(shí)際生產(chǎn)中看CentOS, REHL都是不錯(cuò)的選擇,推薦使用CentOS, REHL 版本為6以后的,當(dāng)然Oracle Linux也是一個(gè)不錯(cuò)的選擇。雖然從MySQL 5.5后對(duì)Windows做了優(yōu)化,但也不推薦在高并發(fā)環(huán)境中使用windows.
4. 合理的優(yōu)化系統(tǒng)的參數(shù)
更改文件句柄 ulimit –n 默認(rèn)1024 太小
進(jìn)程數(shù)限制 ulimit –u 不同版本不一樣
禁掉NUMA numctl –interleave=all
5. 選擇合適的內(nèi)存分配算法
默認(rèn)的內(nèi)存分配就是c的malloc 現(xiàn)在也出現(xiàn)許多優(yōu)化的內(nèi)存分配算法:
jemalloc and tcmalloc
從MySQL 5.5后支持聲明內(nèi)存儲(chǔ)方法。
[mysqld_safe]
malloc-lib = tcmalloc
或是直接指到so文件
[mysqld_safe]
malloc-lib=/usr/local/lib/libtcmalloc_minimal.so
6. 使用更快的存儲(chǔ)設(shè)備ssd或是固態(tài)卡
存儲(chǔ)介質(zhì)十分影響MySQL的隨機(jī)讀取,寫入更新速度。新一代存儲(chǔ)設(shè)備固態(tài)ssd及固態(tài)卡的出現(xiàn)也讓MySQL 大放異彩,也是淘寶在去IOE中干出了一個(gè)漂亮仗。
7. 選擇良好的文件系統(tǒng)
推薦XFS, Ext4,如果還在使用ext2,ext3的同學(xué)請(qǐng)盡快升級(jí)別。 推薦XFS,這個(gè)也是今后一段時(shí)間Linux會(huì)支持一個(gè)文件系統(tǒng)。
文件系統(tǒng)強(qiáng)烈推薦: XFS
8. 優(yōu)化掛載文件系統(tǒng)的參數(shù)
掛載XFS參數(shù):
掛載ext4參數(shù):
如果使用SSD或是固態(tài)盤需要考慮:
• innodb_page_size = 4K
• Innodb_flush_neighbors = 0
9. 選擇適合的IO調(diào)度
正常請(qǐng)下請(qǐng)使用deadline 默認(rèn)是noop
10. 選擇合適的Raid卡Cache策略
請(qǐng)使用帶電的Raid,啟用WriteBack, 對(duì)于加速redo log ,binary log, data file都有好處。
11. 禁用Query Cache
Query Cache在Innodb中有點(diǎn)雞肋,Innodb的數(shù)據(jù)本身可以在Innodb buffer pool中緩存,Query Cache屬于結(jié)果集緩存,如果開(kāi)啟Query Cache更新寫入都要去檢查query cache反而增加了寫入的開(kāi)銷。
在MySQL 5.6中Query cache是被禁掉了。
12. 使用Thread Pool
現(xiàn)在一個(gè)數(shù)據(jù)對(duì)應(yīng)5個(gè)以上App場(chǎng)景比較,但MySQL有個(gè)特性隨著連接增多的情況下性能反而下降,所以對(duì)于連接超過(guò)200的以后場(chǎng)景請(qǐng)考慮使用thread pool. 這是一個(gè)偉大的發(fā)明。
13. 合理調(diào)整內(nèi)存
13.1 減少連接的內(nèi)存分配
連接可以用thread_cache_size緩存,觀查屬于比較屬不如thread pool給力。數(shù)據(jù)庫(kù)在連上分配的內(nèi)存如下:
max_used_connections * (
read_buffer_size +
read_rnd_buffer_size +
join_buffer_size +
sort_buffer_size +
binlog_cache_size +
thread_stack +
2 * net_buffer_length …
)
13.2 使較大的buffer pool
要把60-80%的內(nèi)存分給innodb_buffer_pool_size. 這個(gè)不要超過(guò)數(shù)據(jù)大小了,另外也不要分配超過(guò)80%不然會(huì)利用到swap.
14. 合理選擇LOG刷新機(jī)制
Redo Logs:
– innodb_flush_log_at_trx_commit = 1 // 最安全
– innodb_flush_log_at_trx_commit = 2 // 較好性能
– innodb_flush_log_at_trx_commit = 0 // 最好的情能
binlog :
binlog_sync = 1 需要group commit支持,如果沒(méi)這個(gè)功能可以考慮binlog_sync=0來(lái)獲得較佳性能。
數(shù)據(jù)文件:
15. 請(qǐng)使用Innodb表
可以利用更多資源,在線alter操作有所提高。 目前也支持非中文的full text, 同時(shí)支持Memcache API訪問(wèn)。目前也是MySQL最優(yōu)秀的一個(gè)引擎。
如果你還在MyISAM請(qǐng)考慮快速轉(zhuǎn)換。
16. 設(shè)置較大的Redo log
以前Percona 5.5和官方MySQL 5.5比拼性能時(shí),勝出的一個(gè)Tips就是分配了超過(guò)4G的Redo log ,而官方MySQL5.5 redo log不能超過(guò)4G. 從 MySQL 5.6后可以超過(guò)4G了,通常建Redo log加起來(lái)要超過(guò)500M。 可以通過(guò)觀查redo log產(chǎn)生量,分配Redo log大于一小時(shí)的量即可。
17. 優(yōu)化磁盤的IO
innodb_io_capactiy 在sas 15000轉(zhuǎn)的下配置800就可以了,在ssd下面配置2000以上。
在MySQL 5.6:
innodb_lru_scan_depth = innodb_io_capacity / innodb_buffer_pool_instances
innodb_io_capacity_max = min(2000, 2 * innodb_io_capacity)
18. 使用獨(dú)立表空間
目前來(lái)看新的特性都是獨(dú)立表空間支持:
truncate table 表空間回收
表空間傳輸
較好的去優(yōu)化碎片等管理性能的增加,
整體上來(lái)看使用獨(dú)立表空間是沒(méi)用的。
19. 配置合理的并發(fā)
innodb_thread_concurrency =并發(fā)這個(gè)參數(shù)在Innodb中變化也是最頻繁的一個(gè)參數(shù)。不同的版本,有可能不同的小版本也有變動(dòng)。一般推薦:
在使用thread pool 的情況下:
innodb_thread_concurrency = 0 就可以了。
如果在沒(méi)有thread pool的情況下:
5.5 推薦:innodb_thread_concurrency =16 – 32
5.6 推薦innodb_thread_concurrency = 36
20. 優(yōu)化事務(wù)隔離級(jí)別
默認(rèn)是 Repeatable read
推薦使用Read committed binlog格式使用mixed或是Row
較低的隔離級(jí)別 = 較好的性能
21. 注重監(jiān)控
任環(huán)境離不開(kāi)監(jiān)控,如果少了監(jiān)控,有可能就會(huì)陷入盲人摸象。 推薦zabbix+mpm構(gòu)建監(jiān)控。
- MySQL優(yōu)化必須調(diào)整的10項(xiàng)配置
- mysql優(yōu)化連接數(shù)防止訪問(wèn)量過(guò)高的方法
- mysql優(yōu)化配置參數(shù)
- mysql優(yōu)化limit查詢語(yǔ)句的5個(gè)方法
- MySQL優(yōu)化GROUP BY方案
- MySQL優(yōu)化總結(jié)-查詢總條數(shù)
- MySQL優(yōu)化常用的19種有效方法(推薦!)
- MySQL優(yōu)化全攻略-相關(guān)數(shù)據(jù)庫(kù)命令
- MySQL優(yōu)化配置文件my.ini(discuz論壇)
- MySQL數(shù)據(jù)庫(kù)配置優(yōu)化的方案
相關(guān)文章
mysql多表join時(shí)候update更新數(shù)據(jù)的方法
如果item表的name字段為''就用resource_library 表的resource_name字段前面加上字符串Review更新它,他們的關(guān)聯(lián)關(guān)系在表resource_review_link中。2011-03-03新裝MySql后登錄出現(xiàn)root帳號(hào)提示mysql ERROR 1045 (28000): Access denied
這篇文章主要介紹了新裝MySql后登錄出現(xiàn)root帳號(hào)提示mysql ERROR 1045 (28000): Access denied for use的解決辦法,需要的朋友可以參考下2017-01-01

MySql 存儲(chǔ)引擎和索引相關(guān)知識(shí)總結(jié)

MySQL結(jié)合使用數(shù)據(jù)庫(kù)分析工具SchemaSpy的方法

MYSQL設(shè)置字段自動(dòng)獲取當(dāng)前時(shí)間的sql語(yǔ)句

Mysql觸發(fā)器在PHP項(xiàng)目中用來(lái)做信息備份、恢復(fù)和清空

解決mysql連接超時(shí)和mysql連接錯(cuò)誤的問(wèn)題

mysql下完整導(dǎo)出導(dǎo)入實(shí)現(xiàn)方法