原文地址:Mysql一些重要配置參數的學習與整理(一)
php
最近一直在進行mysql的學習,主要是學習mysql的一些配置參數,瞭解參數的意義,考慮其對mysql性能的影響,向同事要了一份正式服務器上的mysql配置,目前的配置可以知足正式生產環境中的性能要求,在學習mysql的過程當中,對該配置中的一些參數進行了解和學習,這裏總結和整理一下,方便之後回顧。
其中涉及的配置參數主要有如下幾個,接下來會依次進行學習和了解:
skip-external-locking
在某些系統中,lockd鎖管理器可能不能正常工做,可使用skip-external-locking告訴mysqld不使用外部鎖定。(這意味着你不能在同一個數據目錄運行兩個mysqld服務器,並且若是你使用相同內存配置,也須要特別注意)
在Mysql4.0版本以後,外部鎖定默認是禁用的,而啓用外部鎖定(系統鎖定),若是系統上的lockd不能徹底工做(好比Linux系統),很容易形成mysqld死鎖。
明確的禁用外部鎖定,能夠經過配置skip-external-locking。
外部鎖定隻影響存儲引擎爲MyISAM表的訪問。
key_buffer_size = 16M
這個參數的含義是:MyISAM表用於索引塊的緩衝區大小,能夠被全部線程所共享,默認值是8388608(即8M),它是對MyISAM表性能影響最大的一個參數,若是數據庫存儲引擎爲InnoDB類型,這個參數是無效的。能夠經過增大這個值,以便索引更好的處理全部讀和多寫操做。
這裏有兩篇相關的文章值得參閱:
mysql優化:Key_buffer_size
MySQL的key_buffer_size參數
max_allowed_packet = 1M
表示一個數據包的最大大小,或任何生成的/中間字符串,或任何mysql_stmt_send_long_data() API 函數傳遞的參數。數據包消息的緩衝區被初始化爲net_buffer_length的字節(net_buffer_length默認值爲16384:16KB,最大能夠設置爲1048576:1M),可是在須要的時候能夠增加到max_allowed_packet字節,這個參數的默認值是4M,在接收一些大的數據包時可能會出現錯誤,最大能夠設置爲1GB。當你經過修改這個變量的值更改消息緩衝區的大小時,若是客戶端程序容許的話,建議在客戶端也修改緩衝區的大小。在客戶端庫,默認的max_allowed_packet是1GB,可是我的的客戶端可能會重寫這個值,例如,mysql和mysqldump分別是16 MB和24 MB。能夠經過在命令行設置或在配置文件中修改max_allowed_packet參數來更改客戶端的值,須要注意的是:在session會話級別中,這個變量是隻讀的。
table_open_cache = 64
表示全部線程打開表的數量,增長該值會增長mysqld要求的文件描述符的數量?你能夠經過檢查Opened_tables狀態變量來肯定是否須要增長表緩存數量(Opened_tables表示已打開的表的數量)。若是這個值很大,你又不常用FLUSH TABLES(這個命令會強制關閉並從新打開全部表),能夠增長table_open_cache的值。
table_open_cache和max_connections系統變量影響文件服務器保持打開的最大數量。若是你增長了其中一個或兩個值,可能會超過操做系統上每一個進程打開的文件描述符的數量限制。許多的操做系統容許你增長這個限制,可是也須要肯定操做系統是否有可能增長打開文件的限制,以及如何去作。
table_open_cache的值與max_connections的值存在關係。例如,對於200個併發運行的鏈接,指定table_open_cache的值
至少爲200
*
N,其中
N是
任何參與
執行
查詢的鏈接中關聯
表的最大
數量。你還必須爲臨時表和文件保留一些額外的文件描述符。
請確保你的操做系統可以處理由table_open_cache設置的隱含打開的文件描述符的數量。若是table_open_cache值設置的過高,MYSQL可能使用完文件描述符而拒絕鏈接,不能執行查詢,並會變的不可靠。還必須須要考慮的是,MyISAM存儲引擎中,每一個惟一打開的表都須要兩個文件描述符。你能夠經過在mysqld的啓動選項中配置open-files-limit參數,來增長MySQL可用的文件描述符的數量。
sort_buffer_size = 512K
表示爲每個須要排序的會話分配一個指定的緩存區大小。sort_buffer_size的值不特定於任何存儲引擎,它適用於對優化的通常方式。經過SHOW GLOBAL STATUS命令,若是你發現每秒鐘有許多的Sort_merge_passes輸出(Sort_merge_passes表示不得不作合併排序算法的數量),咱們就須要考慮增長sort_buffer_size的值,以加快order by 或 group by 等操做的查詢性能(order by和group by的查詢效率很難經過優化查詢和改善索引提供效率)。
優化器會嘗試找出有多少空間是必要的,但能夠分配更多,直到達到極限。值得注意的是:若是全局的設置,大於系統所須要的值,將減緩大部分涉及排序的查詢效率。最好在session會話級別增長它的值,並且值針對那些須要增長sort_buffer_size的session會話。在Linux系統中,有256KB和2MB的閾值,其中較大的值可能顯著減慢內存分配,因此你應該考慮那些較小的值。
net_buffer_length = 8K
每一個客戶端線程都與一個connection鏈接緩衝區和結果緩衝區相關聯,默認值是16K。二者最初的大小都是net_buffer_length,可是根據須要會動態的擴大到max_allowed_packet設置的大小,結果緩衝區在每個sql語句執行後都會縮小到設置的net_buffer_length。
這個變量一般不該該改變,可是若是你的系統內存很小,你能夠將其設置爲客戶端語句的指望長度。若是語句的長度超過這個值,connection鏈接緩衝區會自動的擴大。net_buffer_length參數的最大值能夠設置到1M。須要注意的是:在session會話級別中,這個變量是隻讀的。
read_buffer_size = 256K
進行順序掃描的MyISAM表的
每一個線程,都爲它掃描的每一個表分配一個指定大小的緩衝區。若是須要作不少的順序掃描,你可能會增大這個值,默認值爲131072(128K)。這個變量的值應該是4KB的倍數。若是它被設置爲不是4KB的倍數,它的值將被舍入爲4KB的最近倍數。
該參數在如下狀況時適用於全部的搜索引擎:
若是使用
另一個存儲引擎,須要爲MEMORY表肯定內存塊大小。
read_buffer_size
最大容許
設置爲
2GB
。
read_rnd_buffer_size = 512K
此變量用於多範圍讀取優化,包括MyISAM表以及任何存儲引擎。當從一個有排序操做的MyISAM表的一個關鍵分揀操做中讀取行,該行經過該緩衝區讀取,以免磁盤尋道。設置這個值爲較大的值能夠顯著的提升ORDER BY操做的性能,
然而,這是分配給每個客戶端的緩衝區,因此不該該在全局級別將其設置爲一個較大的值。相反,只有在須要進行大量查詢操做的客戶端才建議在session會話級別增大這個變量值。read_rnd_buffer_size最大容許設置爲2GB。
myisam_sort_buffer_size = 8M
表示在REPAIR TABLE上進行MyISAM索引排序時,或經過CREATE INDEX、ALTER TABLE建立索引時,分配的緩衝區大小。相應的,對於InnoDB引擎,有InnoDB_sort_buffer_size的設置。
query_cache_size= 8M
表示分配給高速緩存查詢結果的內存量。默認狀況下,查詢緩存是禁用的。這是經過使用默認的query_cache_size爲 1M,query_cache_type爲0(爲0表示不啓用查詢緩存)使用的,這樣作會顯著下降開銷,由於若是你設置了query_cache_size爲0,你也須要在啓動時設置query_cache_type爲0。
容許設置的值爲1024的倍數,其餘設置的值會四捨五入到最近的那個值。 須要
注意的是,即便query_cache_type設置爲0,query_cache_size字節的內存也會被默認的分配。
查詢緩存須要一個最小大小約40 kb的分配結構(具體的值取決於系統結構)。若是設置的query_cache_size過小,還可能會產生一些問題。
query_cache_type的值有0、一、2三種,0表示不進行任何查詢緩存;1表示
緩存全部可緩存的查詢結果除了那些以SELECT SQL_NO_CACHE開頭的查詢;2表示只緩存以SELECT SQL_CACHE開頭的查詢結果。mysql官方doc建議設置爲2。
thread_cache_size = 20
表示服務器將會緩存重用的線程數量,當一個客戶端斷開鏈接,若是緩存中線程的數量小於設置的thread_cache_size,那麼這個客戶端的線程會變放入到緩存中。請求的線程若是可能的話,會從高速緩存中去的線程,當緩存爲空時,纔會建立新的線程。若是系統中存在許多新的鏈接的話,增長這個變量值能夠提升性能。一般狀況下,若是你的代碼中很好的作了線程實現,這種性能改進並不顯著。然而,若是你的服務器每秒有數百個鏈接,你一般應該設置thread_cache_size足夠高,大多數新鏈接都會使用緩存的線程。經過比較這個變量與Connections(表示嘗試鏈接到Mysql服務器的數量(不管是否鏈接成功))和Threads_created(表示處理connection鏈接所建立的線程的數量)狀態變量之間的區別,你能夠看到線程緩存的高效。
這個變量的默認值是根據如下公式計算的,封頂爲100:8 + (max_connections / 100),可是在嵌入式服務器(libmysqld)這個變量是沒有效果的,在MySQL 5.7.2版本以後,這個參數也再也不可見。
log-bin=mysql-bin
表示啓用二進制日誌記錄,服務器記錄了全部改變數據語句的二進制日誌,用於備份和複製。
binlog_format=mixed
以前
Mysql中事務隔離級別與binlog_format的一點理解中學習,這裏再也不贅述。 未完待續...