優化MySQL的21個建議
今天一個朋友向我諮詢怎麼去優化 MySQL,我按著思維整理了一下,大概粗的可以分為21個方向。 還有一些細節東西(table cache, 表設計,索引設計,程式端快取之類的)先不列了,對一個系統,初期能把下面做完也是一個不錯的系統。
1. 要確保有足夠的記憶體
資料庫能夠高效的執行,最關建的因素需要記憶體足更大了,能快取住資料,更新也可以在記憶體先完成。但不同的業務對記憶體需要強度不一樣,一推薦記憶體要佔到資料的15-25%的比例,特別的熱的資料,記憶體基本要達到資料庫的80%大小。
2. 需要更多更快的CPU
MySQL 5.6可以利用到64個核,而MySQL每個query只能執行在一個CPU上,所以要求更多的CPU,更快的CPU會更有利於併發。
3. 要選擇合適的作業系統
在官方建議估計最推薦的是Solaris, 從實際生產中看CentOS, REHL都是不錯的選擇,推薦使用CentOS, REHL 版本為6以後的,當然Oracle Linux也是一個不錯的選擇。雖然從MySQL 5.5後對Windows做了優化,但也不推薦在高併發環境中使用windows.
4. 合理的優化系統的引數
更改檔案控制程式碼 ulimit -n 預設1024 太小
程式數限制 ulimit -u 不同版本不一樣
禁掉NUMA numctl -interleave=all
5. 選擇合適的記憶體分配演算法
預設的記憶體分配就是c的malloc 現在也出現許多優化的記憶體分配演算法:
jemalloc and tcmalloc
從MySQL 5.5後支援宣告記憶體儲方法。
[mysqld_safe]
malloc-lib = tcmalloc
或是直接指到so檔案
[mysqld_safe]
malloc-lib=/usr/local/lib/libtcmalloc_minimal.so
6. 使用更快的儲存裝置ssd或是固態卡
儲存介質十分影響MySQL的隨機讀取,寫入更新速度。新一代儲存裝置固態ssd及固態卡的出現也讓MySQL 大放異彩,也是淘寶在去IOE中幹出了一個漂亮仗。
7. 選擇良好的檔案系統
推薦XFS, Ext4,如果還在使用ext2,ext3的同學請儘快升級別。 推薦XFS,這個也是今後一段時間Linux會支援一個檔案系統。
檔案系統強烈推薦: XFS
8. 優化掛載檔案系統的引數
掛載XFS引數:
(rw, noatime,nodiratime,nobarrier)
掛載ext4引數:
ext4 (rw,noatime,nodiratime,nobarrier,data=ordered)
如果使用SSD或是固態盤需要考慮:
• innodb_page_size = 4K
• Innodb_flush_neighbors = 0
9. 選擇適合的IO排程
正常請下請使用deadline 預設是noop
echo dealine >/sys/block/{DEV-NAME}/queue/scheduler
10. 選擇合適的Raid卡Cache策略
請使用帶電的Raid,啟用WriteBack, 對於加速redo log ,binary log, data file都有好處。
11. 禁用Query Cache
Query Cache在Innodb中有點雞肋,Innodb的資料本身可以在Innodb buffer pool中快取,Query Cache屬於結果集快取,如果開啟Query Cache更新寫入都要去檢查query cache反而增加了寫入的開銷。
在MySQL 5.6中Query cache是被禁掉了。
12. 使用Thread Pool
現在一個資料對應5個以上App場景比較,但MySQL有個特性隨著連線增多的情況下效能反而下降,所以對於連線超過200的以後場景請考慮使用thread pool. 這是一個偉大的發明。
13. 合理調整記憶體
13.1 減少連線的記憶體分配
連線可以用thread_cache_size快取,觀查屬於比較屬不如thread pool給力。資料庫在連上分配的記憶體如下:
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%的記憶體分給innodb_buffer_pool_size. 這個不要超過資料大小了,另外也不要分配超過80%不然會利用到swap.
14. 合理選擇LOG重新整理機制
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支援,如果沒這個功能可以考慮binlog_sync=0來獲得較佳效能。
資料檔案:
innodb_flush_method = O_DIRECT
15. 請使用Innodb表
可以利用更多資源,線上alter操作有所提高。 目前也支援非中文的full text, 同時支援Memcache API訪問。目前也是MySQL最優秀的一個引擎。
如果你還在MyISAM請考慮快速轉換。
16. 設定較大的Redo log
以前Percona 5.5和官方MySQL 5.5比拼效能時,勝出的一個Tips就是分配了超過4G的Redo log ,而官方MySQL5.5 redo log不能超過4G. 從 MySQL 5.6後可以超過4G了,通常建Redo log加起來要超過500M。 可以通過觀查redo log產生量,分配Redo log大於一小時的量即可。
17. 優化磁碟的IO
innodb_io_capactiy 在sas 15000轉的下配置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. 使用獨立表空間
目前來看新的特性都是獨立表空間支援:
truncate table 表空間回收
表空間傳輸
較好的去優化碎片等管理效能的增加,
整體上來看使用獨立表空間是沒用的。
19. 配置合理的併發
innodb_thread_concurrency =併發這個引數在Innodb中變化也是最頻繁的一個引數。不同的版本,有可能不同的小版本也有變動。一般推薦:
在使用thread pool 的情況下:
innodb_thread_concurrency = 0 就可以了。
如果在沒有thread pool的情況下:
5.5 推薦:innodb_thread_concurrency =16 – 32
5.6 推薦innodb_thread_concurrency = 36
20. 優化事務隔離級別
預設是 Repeatable read
推薦使用Read committed binlog格式使用mixed或是Row
較低的隔離級別 = 較好的效能
21. 注重監控
任環境離不開監控,如果少了監控,有可能就會陷入盲人摸象。 推薦zabbix+mpm構建監控。
相關文章
- MySQL 調優/優化的 100 個建議MySql優化
- Mysql優化建議MySql優化
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- MySQL InnoDB行鎖優化建議MySql優化
- MySQL效能優化的21個最佳實踐 和 mysql使用索引MySql優化索引
- MySQL 高效能優化規範建議MySql優化
- Redis優化建議Redis優化
- EntityFramework 優化建議Framework優化
- mysql鎖機制總結,以及優化建議MySql優化
- (1) Mysql高效能優化規範建議MySql優化
- C\C++程式碼優化的27個建議C++優化
- Zabbix 5.0 優化建議優化
- html前端優化建議HTML前端優化
- 頁面優化建議優化
- MySQL效能優化的最佳21條經驗MySql優化
- MySQL效能優化的21條最佳經驗MySql優化
- 優化 Webpack 構建效能的幾點建議優化Web
- 優化Webpack構建效能的幾點建議優化Web
- MySQL資料庫設計規範和優化建議MySql資料庫優化
- 資料庫優化建議資料庫優化
- UITableView效能優化的幾點建議UIView優化
- 對SGA和PGA的優化建議優化
- MySQL的最佳化建議和策略MySql
- MySQL資料庫優化:縮小資料的五點建議VCMySql資料庫優化
- 【建議】 暫提三種優化優化
- oracle 效能優化建議小結Oracle優化
- 頁面優化的一些建議優化
- PHP程式碼優化的40條建議PHP優化
- 優化python程式的幾點建議優化Python
- Python效能優化的20條建議Python優化
- Android 優化APP 構建速度的17條建議Android優化APP
- Android 優化 APP 構建速度的 17 條建議Android優化APP
- MySQL資料庫效能優化的21條經驗MySql資料庫優化
- 記一次介面效能優化實踐總結:優化介面效能的八個建議優化
- mysql索引優化和TCP協議MySql索引優化TCP協議
- ORACLE SQL 效能優化的一些建議OracleSQL優化
- 雅虎軍規——前端優化的35條建議前端優化
- .NET程式的效能要領和優化建議優化