MySQL調優

在Apache, PHP, mysql的體系架構中,MySQL對於性能的影響最大,也是關鍵的核心部分。對於Discuz!論壇程序也是如此,MySQL的設置是否合理優化,直接 影響到論壇的速度和承載量!同時,MySQL也是優化難度最大的一個部分,不但須要理解一些MySQL專業知識,同時還須要長時間的觀察統計而且根據經驗 進行判斷,而後設置合理的參數。mysql

 
  下面咱們瞭解一下MySQL優化的一些基礎,MySQL的優化我分爲兩個部分,一是服務器物理硬件的優化,二是MySQL自身(my.cnf)的優化。
 
1、服務器硬件對MySQL性能的影響
 
① 磁盤尋道能力(磁盤I/O),以目前高轉速SCSI硬盤(7200轉/秒)爲例,這種硬盤理論上每秒尋道7200次,這是物理特性決定的,沒有辦法改變。 MySQL每秒鐘都在進行大量、複雜的查詢操做,對磁盤的讀寫量可想而知。因此,一般認爲磁盤I/O是制約MySQL性能的最大因素之一,對於日均訪問量 在100萬PV以上的Discuz!論壇,因爲磁盤I/O的制約,MySQL的性能會很是低下!解決這一制約因素能夠考慮如下幾種解決方案:  使用RAID-0+1磁盤陣列,注意不要嘗試使用RAID-5,MySQL在RAID-5磁盤陣列上的效率不會像你期待的那樣快。
 
②CPU 對於MySQL應用,推薦使用S.M.P.架構的多路對稱CPU,例如:可使用兩顆Intel Xeon 3.6GHz的CPU,如今我較推薦用4U的服務器來專門作數據庫服務器,不只僅是針對於mysql。
 
③物理內存對於一臺使用MySQL的Database Server來講,服務器內存建議不要小於2GB,推薦使用4GB以上的物理內存,不過內存對於如今的服務器而言能夠說是一個能夠忽略的問題,工做中遇到了高端服務器基本上內存都超過了16G。
 
2、 MySQL自身因素
 
當解決了上述服務器硬件制約因素後,讓咱們看看MySQL自身的優化是如何操做的。對MySQL自身的優化主要是對其配置文件 my.cnf中的各項參數進行優化調整。下面咱們介紹一些對性能影響較大的參數。  因爲my.cnf文件的優化設置是與服務器硬件配置息息相關的,於是咱們指定一個假想的服務器硬件環境:
 
下面,咱們根據以上硬件配置結合一份已經優化好的my.cnf進行說明:
 
 
#vim /etc/my.cnf如下只列出my.cnf文件中[mysqld]段落中的內容,其餘段落內容對MySQL運行性能影響甚微,於是姑且忽略。
  代碼以下   複製代碼
[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-locking
#避免MySQL的外部鎖定,減小出錯概率加強穩定性。
skip-name-resolve
#禁止MySQL對外部鏈接進行DNS解析,使用這一選項能夠消除MySQL進行DNS解析的時間。但須要注意,若是開啓該選項,則全部遠程主機鏈接受權都要使用IP地址方式,不然MySQL將沒法正常處理鏈接請求!
back_log = 384
#back_log 參數的值指出在MySQL暫時中止響應新請求以前的短期內多少個請求能夠被存在堆棧中。  若是系統在一個短期內有不少鏈接,則須要增大該參數的值,該參數值指定到來的TCP/IP鏈接的偵聽隊列的大小。不一樣的操做系統在這個隊列大小上有它自 己的限制。 試圖設定back_log高於你的操做系統的限制將是無效的。默認值爲50。對於Linux系統推薦設置爲小於512的整數。
key_buffer_size = 256M
#key_buffer_size指定用於索引的緩衝區大小,增長它可獲得更好的索引處理性能。對於內存在4GB左右的服務器該參數可設置爲256M或384M。注意:該參數值設置的過大反而會是服務器總體效率下降!
max_allowed_packet = 4M
thread_stack = 256K
table_cache = 128K
sort_buffer_size = 6M
#查詢排序時所能使用的緩衝區大小。注意:該參數對應的分配內存是每鏈接獨佔,若是有100個鏈接,那麼實際分配的總共排序緩衝區大小爲100 × 6 = 600MB。因此,對於內存在4GB左右的服務器推薦設置爲6-8M。
read_buffer_size = 4M
#讀查詢操做所能使用的緩衝區大小。和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享。
join_buffer_size = 8M
#聯合查詢操做所能使用的緩衝區大小,和sort_buffer_size同樣,該參數對應的分配內存也是每鏈接獨享。
myisam_sort_buffer_size = 64M
table_cache = 512
thread_cache_size = 64
query_cache_size = 64M
# 指定MySQL查詢緩衝區的大小。能夠經過在MySQL控制檯觀察,若是Qcache_lowmem_prunes的值很是大,則代表常常出現緩衝不夠的 狀況;若是Qcache_hits的值很是大,則代表查詢緩衝使用很是頻繁,若是該值較小反而會影響效率,那麼能夠考慮不用查詢緩 衝;Qcache_free_blocks,若是該值很是大,則代表緩衝區中碎片不少。
tmp_table_size = 256M
max_connections = 768
#指定MySQL容許的最大鏈接進程數。若是在訪問論壇時常常出現Too Many Connections的錯誤提 示,則須要增大該參數值。
max_connect_errors = 10000000
wait_timeout = 10
#指定一個請求的最大鏈接時間,對於4GB左右內存的服務器能夠設置爲5-10。
thread_concurrency = 8
#該參數取值爲服務器邏輯CPU數量*2,在本例中,服務器有2顆物理CPU,而每顆物理CPU又支持H.T超線程,因此實際取值爲4*2=8
skip-networking
#開啓該選項能夠完全關閉MySQL的TCP/IP鏈接方式,若是WEB服務器是以遠程鏈接的方式訪問MySQL數據庫服務器則不要開啓該選項!不然將沒法正常鏈接!
table_cache=1024
#物理內存越大,設置就越大.默認爲2402,調到512-1024最佳
innodb_additional_mem_pool_size=4M
#默認爲2M
innodb_flush_log_at_trx_commit=1
#設置爲0就是等到innodb_log_buffer_size列隊滿後再統一儲存,默認爲1
innodb_log_buffer_size=2M
#默認爲1M
innodb_thread_concurrency=8
#你的服務器CPU有幾個就設置爲幾,建議用默認通常爲8
key_buffer_size=256M
#默認爲218,調到128最佳
tmp_table_size=64M
#默認爲16M,調到64-256最掛
read_buffer_size=4M
#默認爲64K
read_rnd_buffer_size=16M
#默認爲256K
sort_buffer_size=32M
#默認爲256K
thread_cache_size=120
#默認爲60
query_cache_size=32M
 
 
若是從數據庫平臺應用出發,我仍是會首選myisam.
 
PS:可能有人會說你myisam沒法抗太多寫操做,可是我能夠經過架構來彌補,說個我現有用的數據庫平臺容量:主從數據總量在幾百T以上,天天十多億 pv的動態頁面,還有幾個大項目是經過數據接口方式調用未算進pv總數,(其中包括一個大項目由於初期memcached沒部署,致使單臺數據庫天天處理 9千萬的查詢)。而個人總體數據庫服務器平均負載都在0.5-1左右。
 
MyISAM和InnoDB優化:
 
key_buffer_size – 這對MyISAM表來講很是重要。若是隻是使用MyISAM表,能夠把它設置爲可用內存的 30-40%。合理的值取決於索引大小、數據量以及負載 — 記住,MyISAM表會使用操做系統的緩存來緩存數據,所以須要留出部份內存給它們,不少狀況下數據比索引大多了。儘管如此,須要老是檢查是否全部的 key_buffer 都被利用了 — .MYI 文件只有 1GB,而 key_buffer 卻設置爲 4GB 的狀況是很是少的。這麼作太浪費了。若是你不多使用MyISAM表,那麼也保留低於 16-32MB 的 key_buffer_size 以適應給予磁盤的臨時表索引所需。
 
innodb_buffer_pool_size – 這對Innodb表來講很是重要。Innodb相比MyISAM表對緩衝更爲敏感。MyISAM能夠在默認的 key_buffer_size 設置下運行的能夠,然而Innodb在默認的 innodb_buffer_pool_size 設置下卻跟蝸牛似的。因爲Innodb把數據和索引都緩存起來,無需留給操做系統太多的內存,所以若是隻須要用Innodb的話則能夠設置它高達 70-80% 的可用內存。一些應用於 key_buffer 的規則有 — 若是你的數據量不大,而且不會暴增,那麼無需把 innodb_buffer_pool_size 設置的太大了。
 
innodb_additional_pool_size – 這個選項對性能影響並不太多,至少在有差很少足夠內存可分配的操做系統上是這樣。不過若是你仍然想設置爲 20MB(或者更大),所以就須要看一下Innodb其餘須要分配的內存有多少。
 
innodb_log_file_size 在高寫入負載尤爲是大數據集的狀況下很重要。這個值越大則性能相對越高,可是要注意到可能會增長恢復時間。我常常設置爲 64-512MB,跟據服務器大小而異。
 
innodb_log_buffer_size 默 認的設置在中等強度寫入負載以及較短事務的狀況下,服務器性能還可 以。若是存在更新操做峯值或者負載較大,就應該考慮加大它的值了。若是它的值設置過高了,可能會浪費內存 — 它每秒都會刷新一次,所以無需設置超過1秒所需的內存空間。一般 8-16MB 就足夠了。越小的系統它的值越小。
 
innodb_flush_logs_at_trx_commit 是否爲Innodb比MyISAM慢1000倍而頭大?看來也許你忘了修改這個參數了。默認值是 1,這意味着每次提交的更新事務(或者每一個事務以外的語句)都會刷新到磁盤中,而這至關耗費資源,尤爲是沒有電池備用緩存時。不少應用程序,尤爲是從 MyISAM轉變過來的那些,把它的值設置爲 2 就能夠了,也就是不把日誌刷新到磁盤上,而只刷新到操做系統的緩存上。日誌仍然會每秒刷新到磁盤中去,所以一般不會丟失每秒1-2次更新的消耗。若是設置 爲 0 就快不少了,不過也相對不安全了 — MySQL服務器崩潰時就會丟失一些事務。設置爲 2 指揮丟失刷新到操做系統緩存的那部分事務。
 
table_cache — 打開一個表的開銷可能很大。例如MyISAM把MYI文件頭標誌該表正在使用中。你確定不但願這種操做太頻繁,因此一般要加大緩存數量,使得足以最大限度 地緩存打開的表。它須要用到操做系統的資源以及內存,對當前的硬件配置來講固然不是什麼問題了。若是你有200多個表的話,那麼設置爲 1024 也許比較合適(每一個線程都須要打開表),若是鏈接數比較大那麼就加大它的值。我曾經見過設置爲 100,000 的狀況。
 
thread_cache — 線程的建立和銷燬的開銷可能很大,由於每一個線程的鏈接/斷開都須要。我一般至少設置爲 16。若是應用程序中有大量的跳躍併發鏈接而且 Threads_Created 的值也比較大,那麼我就會加大它的值。它的目的是在一般的操做中無需建立新線程。
 
query_cache — 若是你的應用程序有大量讀,並且沒有應用程序級別的緩存,那麼這頗有用。不要把它設置太大了,由於想要維護它也須要很多開銷,這會致使MySQL變慢。通 常設置爲 32-512Mb。設置完以後最好是跟蹤一段時間,查看是否運行良好。在必定的負載壓力下,若是緩存命中率過低了,就啓用它。
 
sort_buffer_size –若是你只有一些簡單的查詢,那麼就無需增長它的值了,儘管你有 64GB 的內存。搞很差也許會下降性能。
相關文章
相關標籤/搜索