(1)max_connections
最大鏈接數。默認值是151,最多2000。若是服務器的併發鏈接請求量比較大,建議調高此值,以增長並行鏈接數量。可是若是鏈接數越多,介於MySQL會爲每一個鏈接提供鏈接緩衝區,就會開銷越多的內存,因此要適當調整該值。
查看最大鏈接數html
mysql> SHOW VARIABLES LIKE 'max_connections';
查看響應的鏈接數mysql
mysql> SHOW STATUS LIKE 'max%connections';
max_used_connections / max_connections * 100% (理想值≈85%)
若是max_used_connections跟max_connections相同 那麼就是max_connections設置太低或者超過服務器負載上限了,低於10%則設置過大。
(2)back_log
MySQL能暫存的鏈接數量,默認值是80,最多512,可設置爲128。若是MySQL的鏈接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一鏈接釋放資源,該堆棧的數量即back_log。若是等待鏈接的數量超過back_log,將不被授予鏈接資源。當主要MySQL線程在一個很短期內獲得很是多的鏈接請求,這就起做用。
(3)key_buffer_size
索引緩衝區的大小,它決定索引處理的速度,尤爲是索引讀的速度。
經過檢查狀態值Key_read_requests和Key_reads,能夠知道key_buffer_size設置是否合理。sql
mysql> SHOW STATUS LIKE 'key_read%'; +-------------------+----------+ | Variable_name | Value | +-------------------+----------+ | Key_read_requests | 90585564 | | Key_reads | 97031 | +-------------------+----------+
計算索引未命中緩存的機率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%,設置在1/1000左右較好
key_buffer_size只對MyISAM表起做用。即便你不使用MyISAM表,可是內部的臨時磁盤表是MyISAM表,也要使用該值。
默認配置數值是8388608(8M),主機有4GB內存,可改成268435456(256M)
(4)query_cache_size
使用查詢緩存(query cache),MySQL將查詢結果存放在緩衝區中,從此對於一樣的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。
最佳選項是將其從一開始就停用,設爲0(如今MySQL 5.6的默認值)並利用其餘方法加速查詢:優化索引、增長拷貝分散負載或者啓用額外的緩存(好比Redis或Memcached)。
經過檢查狀態值qcache_*,能夠知道query_cache_size設置是否合理數據庫
mysql> SHOW STATUS LIKE 'qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031360 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 10302865 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+----------+
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
若是查詢緩存碎片率超過20%,能夠用FLUSH QUERY CACHE整理緩存碎片,或者試試減少query_cache_min_res_unit,若是你的查詢都是小數據量的話。
查詢緩存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%如下的話說明query_cache_size設置的過大,可適當減少;查詢緩存利用率在80%以上並且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
若是Qcache_lowmem_prunes的值很是大,則代表常常出現緩衝不夠的狀況,若是Qcache_hits的值也很是大,則代表查詢緩衝使用很是頻繁,此時須要增長緩衝大小;若是Qcache_hits的值不大,則代表你的查詢重複率很低,這種狀況下使用查詢緩衝反而會影響效率,那麼能夠考慮不用查詢緩衝。此外,在SELECT語句中加入SQL_NO_CACHE能夠明確表示不使用查詢緩衝。
與查詢緩衝有關的參數還有query_cache_type、query_cache_limit、query_cache_min_res_unit。
query_cache_type指定是否使用查詢緩衝,能夠設置爲0、一、2,該變量是SESSION級的變量。
query_cache_limit指定單個查詢可以使用的緩衝區大小,缺省爲1M。
query_cache_min_res_unit指定分配緩衝區空間的最小單位,缺省爲4K。檢查狀態值Qcache_free_blocks,若是該值很是大,則代表緩衝區中碎片不少,這就代表查詢結果都比較小,此時須要減少query_cache_min_res_unit。
(5)read_buffer_size
是MySQL讀入緩衝區的大小,將對錶進行順序掃描的請求將分配一個讀入緩衝區,MySQL會爲它分配一段內存緩衝區,read_buffer_size變量控制這一緩衝區的大小,若是對錶的順序掃描很是頻繁,並你認爲頻繁掃描進行的太慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能。
默認數值是131072(128K),可改成16773120(16M)
(6)read_rnd_buffer_size
隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySQL會首先掃描一遍該緩衝,以免磁盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但MySQL會爲每一個客戶鏈接發放該緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大。
默認數值是262144(256K),可改成16777208(16M)
(7)sort_buffer_size
每一個須要進行排序的線程分配該大小的一個緩衝區。增長這值加速ORDER BY或GROUP BY操做。
默認數值是10485760(1M),可改成16777208(16M)
(8)join_buffer_size
聯合查詢操做所能使用的緩衝區大小
read_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size爲每一個線程獨佔,也就是說,若是有100個線程鏈接,則佔用爲16M*100
(9)table_open_cache
表高速緩存的大小。每當MySQL訪問一個表時,若是在表緩衝區中還有空間,該表就被打開並放入其中,這樣能夠更快地訪問表內容。
經過檢查峯值時間的狀態值Open_tables和Opened_tables,能夠決定是否須要增長table_cache的值。緩存
mysql> SHOW STATUS LIKE 'open%tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 2000 | | Opened_tables | 0 | +---------------+-------+
若是open_tables等於table_cache,而且opened_tables在不斷增加,那麼就須要增長table_cache的值了。注意,不能盲目地把table_cache設置成很大的值。若是設置得過高,可能會形成文件描述符不足,從而形成性能不穩定或者鏈接失敗。
1G內存機器,推薦值是128-256。內存在4GB左右的服務器該參數可設置爲256M或384M。
(10)max_heap_table_size
用戶能夠建立的內存表(memory table)的大小。這個值用來計算內存表的最大行數值。
這個變量和tmp_table_size一塊兒限制了內部內存表的大小。若是某個內部heap(堆積)表大小超過tmp_table_size,MySQL能夠根據須要自動將內存中的heap表改成基於硬盤的MyISAM表。
(11)tmp_table_size
臨時表的大小,例如作高級GROUP BY操做生成的臨時表。若是調高該值,MySQL同時將增長heap表的大小,可達到提升聯接查詢速度的效果,建議儘可能優化查詢,要確保查詢過程當中生成的臨時表在內存中,避免臨時表過大致使生成基於硬盤的MyISAM表。安全
mysql> SHOW GLOBAL STATUS LIKE 'created_tmp%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Created_tmp_disk_tables | 2884297 | | Created_tmp_files | 870 | | Created_tmp_tables | 15899696 | +-------------------------+----------+
每次建立臨時表,Created_tmp_tables增長,若是臨時表大小超過tmp_table_size,則是在磁盤上建立臨時表,Created_tmp_disk_tables也增長。
Created_tmp_files表示MySQL服務建立的臨時文件文件數,比較理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%
(12)thread_cache_size
線程緩存。當客戶端斷開以後,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷燬(前提是緩存數未達上限)。服務器
mysql> SHOW STATUS LIKE 'threads%'; +-------------------+---------+ | Variable_name | Value | +-------------------+---------+ | Threads_cached | 5 | | Threads_connected | 13 | | Threads_created | 1095313 | | Threads_running | 1 | +-------------------+---------+
Threads_cached :表明當前此時此刻線程緩存中有多少空閒線程。若是過大,代表MySQL服務器一直在建立線程,這也是比較耗資源,能夠適當增長thread_cache_size
Threads_connected :表明當前已創建鏈接的數量,由於一個鏈接就須要一個線程,因此也能夠當作當前被使用的線程數。
Threads_created :表明從最近一次服務啓動,已建立線程的數量。
Threads_running :表明當前激活的(非睡眠狀態)線程數。並非表明正在使用的線程數,有時候鏈接已創建,可是鏈接處於sleep狀態,這裏相對應的線程也是sleep狀態。
建議設置接近Threads_connected值,再結合物理內存:1G-8;2G-16;3G-32 綜合考慮一下值。
(13)interactive_timeout
一個交互鏈接在被服務器在關閉前等待行動的秒數。默認值是28800(8小時),可設置爲7200。
(14)wait_timeout
一個非交互鏈接在被服務器在關閉前等待行動的秒數。要同時設置interactive_timeout和wait_timeout纔會生效。數據結構
(1)innodb_buffer_pool_size
緩衝池的大小,緩存數據和索引,對InnoDB總體性能影響較大,至關於MyISAM的key_buffer_size。若是隻用Innodb,能夠把這個值設爲內存的70%-80%。越大越好,這能保證你在大多數的讀取操做時使用的是內存而不是硬盤。
(2)innodb_log_buffer_size
還沒有執行的事務的緩存大小,默認值爲8M,通常8M-16M。若是你有不少事務的更新,插入或刪除操做,經過這個參數會大量的節省了磁盤I/O。可是若是你的事務中包含有二進制大對象或者大文本字段的話,這點緩存很快就會被填滿並觸發額外的I/O操做。看看Innodb_log_waits狀態變量,若是它不是0,應該增大這個值。但太大了也是浪費內存,由於1秒鐘總會flush一次,因此不須要設到超過1秒的需求。
(3)innodb_flush_log_at_trx_commit
把log buffer的數據寫入日誌文件並flush磁盤的策略,該值對插入數據的速度影響很是大。取值分別爲0、1(默認值)、2(推薦值)
0:事務提交時,不寫入磁盤,而是每秒把log buffer的數據寫入日誌文件,而且flush(刷到磁盤)。速度最快,但不安全。mysqld進程的崩潰會致使上一秒鐘全部事務數據的丟失。
1:每次事務提交時把log buffer的數據寫入日誌文件,而且flush(刷到磁盤)。最安全,但也最慢。確保了事務的ACID。
2:每次事務提交時把log buffer的數據寫入日誌文件,每秒flush(刷到磁盤)。速度較快,比0安全。操做系統崩潰或者系統斷電會致使上一秒鐘全部事務數據的丟失。
(4)innodb_log_file_size
在一個日誌組每一個日誌文件的大小,用於確保寫操做快速而可靠而且在崩潰時恢復。通常用64M-512M,具體取決於服務器的空間。大的文件提供更高的性能,但數據庫恢復時會用更多的時間。
(5)innodb_additional_mem_pool_size
存儲數據字典和其餘內部數據結構的內存池大小。默認爲1M,對於2G內存的機器,推薦值是20M,一般不用太大,應該與表結構的複雜度有關係。若是不夠用,MySQL會在錯誤日誌中寫入一條警告信息。
(6)innodb_buffer_pool_instances
能夠開啓多個內存緩衝池,這樣能夠並行的內存讀寫。默認爲8,通常爲1-8。最常1s就會刷新一次,故不用太大。對於較大的事務,能夠增大緩存大小。若是InnoDB緩存池被劃分紅多個區域,建議每一個區域不小於1GB的空間。併發