Mysql 數據庫的優化mysql
最近一直在搞Mysql數據庫的配置和優化,下面記錄一下這些天研究的結果,以方便之後查看。
1、服務器的硬件的優化
對mysql服務器來講主要從如下幾個方面來考慮:
一、磁盤尋道能力(磁盤I/O)
由於Mysql每一秒都在進行着大量的、複雜的查詢操做,對磁盤的讀寫可想而知,因此一般認爲磁盤的I/O是制約Mysql性能的最大因素之一。若是磁盤的I/O性能很差,形成的直接後果就是MySqL的性能很是低下,對於這種狀況能夠考慮使用RAID1+0。對於硬盤來講最好選那種轉速比較快的,這樣數據的操做的效率也會有大的提升。
二、cpu對於Mysqlr 影響也是不容忽視的,要選擇運算能力強悍的cpu.
三、內存不要小於2GB,最好使用4GB以上的物理內存。
四、服務器選擇上能夠dell的R710 2顆cpu(雙四核) 16G內存(這個能夠擴展的)硬盤有兩種選擇:一個是300G、15000r的,一種是500G的7200r的 能夠根據本身的須要來選擇。也可選HP的DL580G5。我在工做中使用的dell的R710。
2、MySqL配置文件的優化
MySqL在服務器上安裝最好是選擇源碼編譯安裝。對於MySqL的優化主要是在/etc/my.cnf這個文件中來修改一些參數。
在這個文件中主要的參數是在[mysqld]這部分中,這部分中主要包括了mysqld服務啓動參數,它涉及的方面不少,其中有MysqL的目錄文件和文件、通訊、網絡、信息安全、內存管理、優化、查詢緩存區,還有MySql的日誌設置等。下面就來看一下這個有文件中的參數:
port = 3306
// mysql服務的運行時的端口
socket = /tmp/mysql.sock
//socket文件是在Linux/Unix環境下特有的,用戶在Linux/Unix環境下客戶端鏈接能夠不經過TCP/IP網絡而直接使用unix socket鏈接MySqL。
skip-locking
//避免MySqL的外部鎖定,減小出錯率,加強穩定性。
skip-name-resolve
//禁止MySQL對外部鏈接進行DNS解析,使用這一選項能夠消除MySQL進行DNS解析的時間。但須要注意的是,若是開啓該選項,財全部遠程主機鏈接受權都要使用IP地址的方式了,不然MySQL將沒法正常處理鏈接請求!
back_log = 256
//back_log參數的值指出在MySqL暫時中止響應新請求以前,短期內多少個請求能夠被存在堆棧中。若是系統在短期內有不少鏈接,則須要增大該參數的值,該參數值指定到來的TCP/IP鏈接的監聽隊列的大小。不一樣操做系統在這個隊列的大小上有本身的限制。若是試圖將back_log設定得高於操做系統的限制將是無效的。其默認值爲50。對於Linux系統而言,推薦設置爲小於512的整數。
key_buffer_size = 256
//指定用於索引的緩衝區大小,增長它可獲得更好的索引處理性能。對於內存4GB左右的服務器來講,該參數可設置爲256MB或者384MB。
max_allowed_packet = 1M
//設定在網絡傳輸中一次消息量的最大值。系統默認爲1MB,最大值1GB,必須設定爲1024的倍數,單位爲字節。
thread_stack = 192K
//設置MySQL每一個線程的堆棧大小,默認值足夠大,可知足普通操做。可設置範圍爲128KB至4GB。默認爲192KB。
table_cache = 614K (mysql 5.1.3以後這個設置就變爲了table_open_cache)
//指示表高速緩衝區的大小。當MySqL訪問一個表時,若是在MySQL表緩衝區中還有空間,那麼這個表就被打開並放入表緩衝區,這樣作的好處是能夠更快速地訪問表中的內容。通常來講,能夠查看數據庫運行峯值時間的狀態值Open_tables和Opened_tables,用以判斷是否須要增長table_cache的值,即若是Open_cache的接近table_cache的時候,而且Opened_tables這個值在逐漸增長,那就要考慮增長這個值的大小了。
sort_buffer_size = 6M
//設定查詢排序時使用的緩衝區大小,系統默認大小爲2MB。注意::這個參數對應的分配內存是每一個鏈接獨佔的,若是有100個鏈接,那麼實際分配的總排序緩衝區大小爲100x6=600MB。因此,對於內存在4GB左右的服務器來講,推薦將其設置爲6MB到8MB
read_buffer_size = 2M
//讀查詢操做所能使用的緩衝區大小。和sort_buffer_size同樣,該參數對應的分配內存也是每一個鏈接獨享。
join_buffer_size = 4M
//聯合查詢操做所能使用的緩衝區大小,和sort_buffer_size同樣,該參數對應的分配內存也是每一個鏈接獨享。
myisam_sort_buffer_size = 8M
//設置在REPAIR TABLE或用CAREATE INDEX建立索引或ALTER TABLE 的過程當中排序索引所分配的緩衝區大小,可設置範圍4Bytes到4GB,默認爲8MB。
thread_cache_size = 64
//設置Thread Cache池中能夠緩存的鏈接線程的最大數量,能夠設置爲0~16384,默認爲0。這個值表示能夠從新利用保存在緩存中線程的數量。當斷開鏈接時若是緩存中還有空間,那麼客戶端的線程將被放到緩存中;若是線程從新被請求,那麼請求將從緩存中讀取;若是緩存中是空的或者是新的請求,那麼這個線程將被從新建立;若是有不少新的線程,增長這個值能夠改善系統性能。經過比較Connections和Threads_created狀態的變量,能夠看到這個變量的做用。咱們能夠根據物理內存設置規則以下:1GB內存咱們配置爲8,2GB內存咱們配置爲16,3GB咱們配置爲32,4GB或更大的咱們給此值爲64或更大的數值。
query_cache_size=256M
//指定MySQL查詢緩衝的大小。能夠經過在MySQL控制檯觀察,若是Qcache_lowmem_prunes的值很是大,則代表常常出現緩衝不夠的狀況;若是Qcache_hits的值很是大,則代表查詢緩衝使用得很是頻繁。另外,若是該值較小反而會影響效率,那麼能夠考慮不用查詢緩衝。對於Qcache_free_block,若是該值很是大,則代表緩衝區中碎片不少。
tmp_table_size = 256M
//設置內存臨時表最大值。若是超過該值,則將會把臨時表寫入磁盤,其範圍爲1KB到4GB。
max_connections = 5000
//指定MySQL容許的最大鏈接進程數。若是在訪問論壇時常常出現Too Many Connections的錯誤提示,則須要增大該參數值。
max_connect_errors = 6000
//設置每一個主機的鏈接請求異常中斷的最大次數,當超過該次數,MySQL服務器將禁止host的鏈接請求,直到MySQL服務器從新啓動或經過flush hosts 命令清空此host的相關信息。
wait_timeout = 120
//指定一個請求的最大鏈接時間,對於4GB左右內存的服務器來講,能夠將其設置爲5~10.
thread_concurrency = 8
//該參數取值爲服務器邏輯CPU數量X2,在本例中,服務器有兩個物理CPU,而每一個物理CPU又支持H.T超線程,因此實際取值爲4X2=8。這也是目前雙四核主流服務器的配置。
skip-networking
//開啓該選項能夠完全關閉MySQL的TCP/IP鏈接方式,若是Web服務器是以遠程鏈接的方式訪問MySQL數據庫服務器的,則不要開啓該選項,不然將沒法正常鏈接!
table_cache = 614 (這個在5.1.3後就變成了table_open_cache)
//給常常訪問的表分配的內存,物理內存越大,設置就越大。調大這個值,通常狀況下能夠下降磁盤IO,可是相應的會佔用更多的物理內存,這這裏設置爲614
innodb_addition_mem_pool_size = 1M
//默認爲1MB
innodb_flush_log_at_trx_commit = 1
//設置爲0就是等到innodb_log_buffer_size列隊滿後再統一儲存,默認爲1,也是最安全的設置。
innodb_log_buffer_size = 2M
//默認爲1MB,一般設置爲8~16MB就足夠了。
innodb_thread_concurrency = 8
//你的服務器有幾個CPU就設置爲幾,建議用默認設置,通常爲8.
read_rnd_buffer_size = 16M
//設置進行隨機讀的時候所使用的緩衝區。此參數和read_buffer_size所設置的Buffer相反,一個是順序讀的時候使用,一個是隨機讀的時候使用。可是二者都是針對線程的設置,每一個線程均可以產生兩種Buffer中的任何一個。read_rnd_buffer_size的默認值256KB,最大值4GB。
以上只一些理論參考值,不少時候須要具體狀況具體分析,其餘參數的變動咱們能夠等MySQL上線穩定一段時間後再根據status值進行調整。