21個優化MySQL的建議

怪我咯
發布: 2017-04-08 09:49:07
原創
1621 人瀏覽過

今天一個朋友向我諮詢怎麼去優化 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]

#  [mysqld_#>

#>

項目

##項目

##好的創造對於問題[3]#\>#>#-#-#-

-

##項目#-#-#-

#項目

##項目

#項目

#好的創造對於>#白]#>##>#>

白>

#>

#>

項目#-

項目

項目

##項目#好的[4>>#白> 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調度

 請 

 9.選擇適合的IO調度

#  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 +######### ######  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 // 最安全

#  - inno_flushx

##  - innodb_flush_log_at_trx_commit  = 0 // 最好的情能

  binlog :

  binlog_sync = 1 需要group commit來獲得這個功能可以考慮這個功能可以考慮佳性能。

  資料檔:

  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 ,而官方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

  inn

## 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 = ##  5.6 推薦innodb_thread_concurrency = ##  5.6 推薦innodb_thread_concurrency#366.隔離等級

  預設是Repeatable read

  建議使用Read committed  binlog格式使用mixed或是Row

  較低的隔離等級= 較好的效能

 21. 注重監控

  任環境離不開監控,如果少了監控,有可能就會陷入盲人摸象。 推薦zabbix+mpm建置監控。

以上是21個優化MySQL的建議的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板