今天有個朋友跟我諮詢怎麼去優化 MySQL,我按著思考整理了一下,大概粗的可以分成21個方向。 還有一些細節東西(table cache, 表設計,索引設計,程式端快取之類的)先不列了,對一個系統,初期能把下面做完也是一個不錯的系統。
1. 要確保有足夠的內存
數據庫能夠高效的運行,最關建的因素需要內存足更大了,能緩存住數據,更新也可以在內存先完成。但不同的業務對記憶體需要強度不一樣,一推薦記憶體要占到數據的15-25%的比例,特別的熱的數據,記憶體基本上要達到資料庫的80%大小。
2. 需要更多更快的CPU
MySQL 5.6可以利用到64個核,而MySQL每個query只能運行在一個CPU上,所以要求更多的CPU,更快的CPU會更有利於並行.
在官方建議估計最推薦的是Solaris, 從實際生產中看CentOS, REHL都是不錯的選擇,推薦使用CentOS, REHL 版本為6以後的,當然Oracle Linux也是不錯的選擇。雖然從MySQL 5.5後對Windows做了最佳化,但也不建議在高並發環境中使用windows. 4. 合理的最佳化系統的參數 更改檔句柄 ulimit -n 預設1024 預設值ulimit -u 不同版本不同 禁掉NUMA numctl -interleave=all 5. 選擇合適的記憶體分配演算法 and tcmalloc 從MySQL 5.5後支援宣告內儲存方法。 [mysqld_safe] malloc-lib = tcmalloc 或是直接指到sotco/lib膜i/lib膜mal.so 6. 使用更快的儲存設備ssd或固態卡 儲存媒體十分影響MySQL的隨機讀取,寫入更新速度。新一代儲存裝置固態ssd及固態卡片的出現也讓MySQL 大放異彩,也是淘寶在去IOE中乾出了一個漂亮仗。 7. 選擇良好的檔案系統 推薦XFS, Ext4,如果還在使用ext2,ext3的同學請盡快升級別。 推薦XFS,這個也是今後一段時間Linux會支援一個檔案系統。 檔案系統強烈建議: XFS 8. 最佳化掛載檔案系統的參數 掛載XFS參數: 〜(rw, nod, noatime))ext4 (rw,noatime,nodiratime,nobarrier,data=ordered)
如果使用SSD或是固態盤需要考慮:
• innodb_page_size = 4Kid
9. 選擇適合的IO調度正常請下請使用deadline 預設是noop echo dealine >/sys/block/{DEV-NAME}/queue/scheduler 10. 選擇適當的Raid卡CacheriteBer對於加速redo log ,binary log, data file都有好處。 11. 停用Query Cache Query Cache在Innodb中有點雞肋,Innodb的資料本身可以在Innodb buffer pool中緩存,Query Cache屬於結果集快取,如果都要去更新寫入ache增加了寫入的開銷。 在MySQL 5.6中Query cache是被禁掉了。 12. 使用Thread Pool 現在一個數據對應5個以上App場景比較,但MySQL有個特性隨著連接增多的情況下性能反而下降,所以對於連接超過200的以後場景請考慮使用thread pool.這是一個偉大的發明。13.1 減少連接的記憶體分配
連接可以用thread_cache_size緩存,觀查屬於比較屬不如thread pool給力。資料庫在連上分配的記憶體如下:
max_used_connections * (
read_buffer_size +
read_rnd_buffer_size +
in uffer_size +
binlog_cache_size +
thread_stack +
2 * net_buffer_length …
2 * net_buffer_length …
『13)讓較大的buffer pool
要把60-80%的記憶體分給innodb_buffer_pool_size. 這個不要超過資料大小了,另外也不要分配超過80%的記憶體分到swap.
14. 合理選擇機制14.
Redo Logs: - innodb_flush_log_at_trx_commit = 1 // 最安全 - innodb_flush_log_at_trx_commit 效能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 ,而官方MyMy5.5 redo log545.後可以超過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
『] 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 推薦 urr識別事務預設是Repeatable read
建議使用Read committed binlog格式使用mixed或是Row
較低的隔離等級= 較好的效能
21. 注重監控
任環境離不開監控,如果少了監控,有可能就會陷入失明。 推薦zabbix+mpm建置監控。