程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 【博文推薦】運維角度淺談MySQL數據庫優化(1)

【博文推薦】運維角度淺談MySQL數據庫優化(1)

編輯:MySQL綜合教程

【博文推薦】運維角度淺談MySQL數據庫優化(1)


本文出自Bkjia博客博主“企鵝”那點事兒,如有任何問題請進入博主頁面互動討論。

博文地址:http://lizhenliang.blog.51cto.com/7876557/1657465

一個成熟的數據庫架構並不是一開始設計就具備高可用、高伸縮等特性的,它是隨著用戶量的增加,基礎架構才逐漸完善。數據庫發展周期大致分為以下五個階段:

1、數據庫表設計

項目立項後,開發部根據產品部需求開發項目,開發工程師工作其中一部分就是對表結構設計。對於數據庫來說,這點很重要,如果設計不當,會直接影響訪問速度和用戶體驗。影響的因素很多,比如慢查詢、低效的查詢語句、沒有適當建立索引、數據庫堵塞(死鎖)等。當然,有測試工程師的團隊,會做壓力測試,找bug。對於沒有測試工程師的團隊來說,大多數開發工程師初期不會太多考慮數據庫設計是否合理,而是盡快完成功能實現和交付,等項目有一定訪問量後,隱藏的問題就會暴露,這時再去修改就不是這麼容易的事了。

2、數據庫部署

該運維工程師出場了,項目初期訪問量不會很大,所以單台部署足以應對在1500左右的QPS(每秒查詢率)。考慮到高可用性,可采用MySQL主從復制+Keepalived做雙擊熱備,常見集群軟件有Keepalived、Heartbeat。

雙機熱備博文:http://lizhenliang.blog.51cto.com/7876557/1362313

3、數據庫性能優化

如果將MySQL部署到普通的X86服務器上,在不經過任何優化情況下,MySQL理論值正常可以處理1500左右並發連接數(QPS),經過優化後,有可能會提升到2000左右QPS,否則,訪問量當達到1000多並發連接時,數據庫處理性能就會變慢,而且硬件資源還很富裕,這時就該考慮軟件問題了。那麼怎樣讓數據庫最大化發揮性能呢?一方面可以單台運行多個MySQL實例讓服務器性能發揮到最大化,另一方面是對數據庫進行優化,往往操作系統和數據庫默認配置都比較保守,會對數據庫發揮有一定限制,可對這些配置進行適當的調整,盡可能的處理更多連接數。

具體優化有以下三個層面:

3.1 數據庫配置優化

MySQL常用有兩種存儲引擎,一個是MyISAM,不支持事務處理,讀性能處理快,表級別鎖。另一個是InnoDB,支持事務處理(ACID),設計目標是為處理大容量數據發揮最大化性能,行級別鎖。

表鎖:開銷小,鎖定粒度大,發生死鎖概率高,相對並發也低。

行鎖:開銷大,鎖定粒度小,發生死鎖概率低,相對並發也高。

為什麼會出現表鎖和行鎖呢?主要是為了保證數據的完整性,舉個例子,一個用戶在操作一張表,其他用戶也想操作這張表,那麼就要等第一個用戶操作完,其他用戶才能操作,表鎖和行鎖就是這個作用。否則多個用戶同時操作一張表,肯定會數據產生沖突或者異常。

根據以上看來,使用InnoDB存儲引擎是最好的選擇,也是MySQL5.5以後版本中默認存儲引擎。每個存儲引擎相關聯參數比較多,以下列出主要影響數據庫性能的參數。

公共參數默認值:

  1. max_connections = 151 
  2. #同時處理最大連接數,推薦設置最大連接數是上限連接數的80%左右    
  3. sort_buffer_size = 2M 
  4. #查詢排序時緩沖區大小,只對order by和group by起作用,可增大此值為16M 
  5. query_cache_limit = 1M   
  6. #查詢緩存限制,只有1M以下查詢結果才會被緩存,以免結果數據較大把緩存池覆蓋 
  7. query_cache_size = 16M   
  8. #查看緩沖區大小,用於緩存SELECT查詢結果,下一次有同樣SELECT查詢將直接從緩存池返回結果,可適當成倍增加此值 
  9. open_files_limit = 1024  
  10. #打開文件數限制,如果show global status like 'open_files'查看的值等於或者大於open_files_limit值時,程序會無法連接數據庫或卡死 

MyISAM參數默認值:

  1. key_buffer_size = 16M#索引緩存區大小,一般設置物理內存的30-40% 
  2. read_buffer_size = 128K  #讀操作緩沖區大小,推薦設置16M或32M 

InnoDB參數默認值:

  1. innodb_buffer_pool_size = 128M 
  2. #索引和數據緩沖區大小,一般設置物理內存的60%-70% 
  3. innodb_buffer_pool_instances = 1     
  4. #緩沖池實例個數,推薦設置4個或8個 
  5. innodb_flush_log_at_trx_commit = 1   
  6. #關鍵參數,0代表大約每秒寫入到日志並同步到磁盤,數據庫故障會丟失1秒左右事務數據。1為每執行一條SQL後寫入到日志並同步到磁盤,I/O開銷大,執行完SQL要等待日志讀寫,效率低。2代表只把日志寫入到系統緩存區,再每秒同步到磁盤,效率很高,如果服務器故障,才會丟失事務數據。對數據安全性要求不是很高的推薦設置2,性能高,修改後效果明顯。 
  7. innodb_file_per_table = OFF   
  8. #默認是共享表空間,共享表空間idbdata文件不斷增大,影響一定的I/O性能。推薦開啟獨立表空間模式,每個表的索引和數據都存在自己獨立的表空間中,可以實現單表在不同數據庫中移動。 
  9. innodb_log_buffer_size = 8M   
  10. #日志緩沖區大小,由於日志最長每秒鐘刷新一次,所以一般不用超過16M 

3.2 系統配置優化

大多數MySQL都部署在linux系統上,所以操作系統的一些參數也會影響到MySQL性能,以下對linux內核進行適當優化。

  1. net.ipv4.tcp_fin_timeout = 30 
  2. #TIME_WAIT超時時間,默認是60s 
  3. net.ipv4.tcp_tw_reuse = 1     
  4. #1表示開啟復用,允許TIME_WAIT socket重新用於新的TCP連接,0表示關閉 
  5. net.ipv4.tcp_tw_recycle = 1   
  6. #1表示開啟TIME_WAIT socket快速回收,0表示關閉 
  7. net.ipv4.tcp_max_tw_buckets = 4096    
  8. #系統保持TIME_WAIT socket最大數量,如果超出這個數,系統將隨機清除一些TIME_WAIT並打印警告信息 
  9. net.ipv4.tcp_max_syn_backlog = 4096 
  10. #進入SYN隊列最大長度,加大隊列長度可容納更多的等待連接 

在linux系統中,如果進程打開的文件句柄數量超過系統默認值1024,就會提示“too many files open”信息,所以要調整打開文件句柄限制。

  1. # vi /etc/security/limits.conf  #加入以下配置,*代表所有用戶,也可以指定用戶,重啟系統生效 
  2. * soft nofile 65535 
  3. * hoft nofile 65535 
  4. # ulimit -SHn 65535   #立刻生效 

3.3 硬件配置

加大物理內存,為提高文件系統性能,linux內核會從內存中分配緩存區(系統緩存和文件緩存)來存放熱數據,也就是說物理內存越大,分配緩存區越大,緩存數據越多。

SSD硬盤代替SAS硬盤,將RAID級別調整為RAID1+0,相對於RAID1和RAID5有更好的讀寫性能(IOPS),畢竟數據庫的壓力主要來自磁盤I/O方面。




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved