MySQL配置優化

MySQL參數優化對於不一樣的網站,及其在線量,訪問量,帖子數量,網絡狀況,以及機器硬件配置都有關係, 優化不可能一次性完成,須要不斷的觀察以及調試,纔有可能獲得最佳效果。 下面列出了對性能優化影響較大 的主要變量,主要分爲鏈接請求的變量和緩衝區變量mysql

一、鏈接請求的變量
1). max_connections
MySQL的最大鏈接數,若是服務器的併發鏈接請求量比較大,建議調高此值,以增長並行鏈接數量,當 然這創建在機器能支撐的狀況下,由於若是鏈接數越多, MySQL會爲每一個鏈接提供鏈接緩衝區,就會開 銷越多的內存,因此要適當調整該值,不能盲目提升設值。 數值太小會常常出現ERROR 1040: Too many connections錯誤,能夠經過 mysql> show status like 'connections'; 通配符查看當前狀態的鏈接數量(試 圖鏈接到MySQL(無論是否鏈接成功)的鏈接數),以定奪該值的大小。web

mysql> show variables like 'max_connections';        # 查看最大鏈接數
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.01 sec)

mysql> show status like 'max_used_connections';        # 響應的鏈接數
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 1     |
+----------------------+-------+
1 row in set (0.00 sec)

max_used_connections / max_connections * 100% (理想值≈ 85%) 若是max_used_connections跟 max_connections相同那麼就是max_connections設置太低或者超過服務器負載上限了,低於10%則設置過大。sql

#修改my.cnf配置文件
[root@mysql ~]# vim /etc/my.cnf 
....................
max_connections = 1024
#重啓服務,並登陸數據庫查看
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1024  |
+-----------------+-------+
1 row in set (0.00 sec)

2).back_log MySQL能暫存的鏈接數量。當主要MySQL線程在一個很短期內獲得很是多的鏈接請求,它就會起做用。若是MySQL的鏈接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一 鏈接釋放資源,該堆棧的數量即back_log,若是等待鏈接的數量超過back_log,將不被授予鏈接資源。 back_log值指出在MySQL暫時中止回答新請求以前的短期內有多少個請求能夠被存在堆棧中。只有如 果指望在一個短期內有不少鏈接,你須要增長它。 當觀察你主機進程列表有許多的待鏈接進程時,就要加大back_log 的值了或加大max_connections的值。數據庫

mysql> show variables like 'back_log';          #查看back_log
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log      | 254   |
+---------------+-------+
1 row in set (0.01 sec)
[root@mysql ~]# vim /etc/my.cnf 
....................
max_connections = 1024
back_log = 10
#重啓服務並查看
mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log      | 10    |        # 能夠看到已經設置爲10
+---------------+-------+
1 row in set (0.00 sec)

3).wait_timeout和interactive_timeout wait_timeout 指的是MySQL在關閉一個非交互的鏈接以前所要等待 的秒數 interactive_time -- 指的是mysql在關閉一個交互的鏈接以前所要等待的秒數,好比咱們在終端上 進入mysql管理,使用的即便交互的鏈接,這時候,若是沒有操做的時間超過了interactive_time設置的時 間就會自動斷開。默認數值是28800,可調優爲7200。vim

**對性能的影響:**
wait_timeout:
(1)若是設置 大小,那麼鏈接關閉的很快,從而使一些持久的鏈接不起做用
(2)若是設置太大,容易形成鏈接打開 時間過長,在show processlist時,能看到太多的sleep狀態的鏈接,從而形成too many connections錯誤
(3)通常但願wait_timeout儘量地低 interactive_timeout的設置將要對你的web application沒有多大 的影響 查看wait_timeout和interactive_timeout
[root@mysql ~]# vim /etc/my.cnf 
..................
wait_timeout = 100 
interactive_timeout = 100
#重啓服務並查看
mysql> show variables like '%interactive_timeout%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 100   |
+---------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like '%wait_tmeout%';        # 設置完畢後,當過100秒後進行使用會出現下方的字樣
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

二、緩衝區變量
全局緩衝:
key_buffer_size指定索引緩衝區的大小,它決定索引處理的速度,尤爲是索引讀的速度。 經過檢查狀態值Key_read_requests和Key_reads,能夠知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該儘量的低,至少是1:100,1:1000更好(上述狀態值可使用SHOW STATUS LIKE ‘key_read%’得到)。
一共有6個索引讀取請求,有3個請求在內存中沒有找到直接從硬盤讀取索引,計算索引未命中緩存的機率: key_cache_miss_rate = Key_reads / Key_read_requests * 100% =50% key_buffer_size只對MyISAM表起做用。 即便你不使用MyISAM表,可是內部的臨時磁盤表是MyISAM表,也要使用該值。可使用檢查狀態值 created_tmp_disk_tables得知詳情。緩存

[root@mysql ~]# vim /etc/my.cnf 
.......................
key_buffer_size = 268435456              # 兩個選一個
key_buffer_size = 256M
#重啓並查看
mysql> show status like 'key_read%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Key_read_requests | 6     |
| Key_reads         | 3     |
+-------------------+-------+
2 rows in set (0.01 sec)

query_cache_size(查詢緩存簡稱QC) 使用查詢緩衝,MySQL將查詢結果存放在緩衝區中,從此對於一樣 的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。 一個SQL查詢若是以select開頭,那麼 MySQL服務器將嘗試對其使用查詢緩存。
注:兩個SQL語句,只要相差哪怕是一個字符(例如大小寫不同;多一個空格等),那麼這兩個SQL 將使用不一樣的一個CACHE。安全

mysql> show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| have_query_cache             | YES     |
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 1048576 |
| query_cache_type             | OFF     |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
6 rows in set (0.00 sec)
#能夠看出query_cache_type爲off表示不緩存任何查詢
#各字段解釋:
query_cache_limit:超過此大小的查 詢將不緩存
query_cache_min_res_unit:緩存塊的最小大小 (query_cache_min_res_unit的配置是一柄」雙刃 劍」,默認是4KB,設置值大對大數據查詢有好處,但若是你的查詢都是小數據查詢,就容易形成內存碎片和浪 費。 )
query_cache_size:查詢緩存大小 (注:QC存儲的最小單位是1024 byte,因此若是你設定了一個不是1024 的倍數的值,這個值會被四捨五入到最接近當前值的等於1024的倍數的值。) 
query_cache_type:緩存類型,決 定緩存什麼樣的查詢,注意這個值不能隨便設置,必須設置爲數字
query_cache_type三個參數的含義:
query_cache_type=0(OFF)關閉
query_cache_type=1(ON)緩存全部結果,除非select語句使用SQL_NO_CACHE禁用查詢緩存
query_cache_type=2(DEMAND),只緩存select語句中經過SQL_CACHE指定須要緩存的查詢

若是設置爲0,那麼能夠說,你的緩存根本就沒有用,至關於禁用了。 若是設置爲1,將會緩存全部的結果,除 非你的select語句使用SQL_NO_CACHE禁用了查詢緩存。 若是設置爲2,則只緩存在select語句中經過 SQL_CACHE指定須要緩存的查詢。 query_cache_wlock_invalidate:當有其餘客戶端正在對MyISAM表進行寫操 做時,若是查詢在query cache中,是否返回cache結果仍是等寫操做完成再讀表獲取結果。
查詢緩存碎片率 = 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_hits +Qcache_inserts) * 100% 。性能優化

Query Cache 的限制 :
a) 全部子查詢中的外部查詢SQL 不能被Cache;
b) 在Procedure,Function 以及Trigger 中 的Query 不能被Cache;
c) 包含其餘不少每次執行可能獲得不同結果的函數的Query不能被Cache。 鑑於上面 的這些限制,在使用Query Cache 的過程當中,建議經過精確設置的方式來使用,僅僅讓合適的表的數據能夠進 入Query Cache,僅僅讓某些Query的查詢結果被Cache。

[root@mysql ~]# vim /etc/my.cnf 
....................
query_cache_size = 256M
query_cache_type = 1
mysql> show variables like '%query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| have_query_cache             | YES       |
| query_cache_limit            | 1048576   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 268435456 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
6 rows in set (0.00 sec)
max_connect_errors是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止 暴力破解密碼的狀況,當超過指定次數,MYSQL服務器將禁止host的鏈接請求,直到mysql服務器重啓或 經過flush hosts命令清空此host的相關信息。max_connect_errors的值與性能並沒有太大關係
[root@mysql ~]# vim /etc/my.cnf 
..............
max_connect_errors=20
mysql> show variables like '%max_connect_error%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 20    |            
+--------------------+-------+
1 row in set (0.00 sec)

sort_buffer_size 每一個須要進行排序的線程分配該大小的一個緩衝區。增長這值加速ORDER BY或GROUP BY操做。 Sort_Buffer_Size 是一個connection級參數,在每一個connection(session)第一次須要使用這個 buffer的時候,一次性分配設置的內存。 Sort_Buffer_Size 並非越大越好,因爲是connection級的參 數,過大的設置+高併發可能會耗盡系統內存資源。服務器

[root@mysql ~]# vim /etc/my.cnf 
................
sort_buffer_size = 2M
mysql> show variables like '%sort_buffer_size%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| innodb_sort_buffer_size | 1048576 |
| myisam_sort_buffer_size | 8388608 |
| sort_buffer_size        | 2097152 |
+-------------------------+---------+
3 rows in set (0.00 sec)

max_allowed_packet = 32M MySQL根據配置文件會限制Server接受的數據包大小。有時候大的插入和更 新會受 max_allowed_packet 參數限制,致使寫入或者更新失敗。最大值是1GB,必須設置1024的倍數。
join_buffer_size = 2M 用於表間關聯緩存的大小,和sort_buffer_size同樣,該參數對應的分配內存也是 每一個鏈接獨享。
thread_cache_size = 300 服務器線程緩存,這個值表示能夠從新利用保存在緩存中線程的數量,當斷開 鏈接時,那麼客戶端的線程將被放到緩存中以響應下一個客戶而不是銷燬(前提是緩存數未達上限),若是線 程從新被請求,那麼請求將從緩存中讀取,若是緩存中是空的或者是新的請求,那麼這個線程將被從新創 建,若是有不少新的線程,增長這個值能夠改善系統性能.經過比較 Connections 和 Threads_created 狀態 的變量,能夠看到這個變量的做用。設置規則以下:1GB 內存配置爲8,2GB配置爲16,3GB配置爲32, 4GB或更高內存,可配置更大。服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷燬(前 提是緩存數未達上限)
Threads_cached :表明當前此時此刻線程緩存中有多少空閒線程。 Threads_connected :表明當前已創建鏈接的 數量,由於一個鏈接就須要一個線程,因此也能夠當作當前被使用的線程數。 Threads_created :表明從最近一 次服務啓動,已建立線程的數量,若是發現Threads_created值過大的話,代表MySQL服務器一直在建立線程, 這也是比較耗資源,能夠適當增長配置文件中thread_cache_size值。 Threads_running :表明當前激活的(非睡 眠狀態)線程數。並非表明正在使用的線程數,有時候鏈接已創建,可是鏈接處於sleep狀態
三、配置InnoDB的幾個變量
innodb_buffer_pool_size 對於InnoDB表來講,innodb_buffer_pool_size的做用就至關於key_buffer_size對 於MyISAM表的做用同樣。InnoDB使用該參數指定大小的內存來緩衝數據和索引。對於單獨的MySQL數 據庫服務器,最大能夠把該值設置成物理內存的80%。根據MySQL手冊,對於2G內存的機器,推薦值是 1G(50%)。 若是你的數據量不大,而且不會暴增,那麼無需把 innodb_buffer_pool_size 設置的太大 了。網絡

[root@mysql ~]# vim /etc/my.cnf 

innodb_buffer_pool_size = 2048M 
mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 2147483648 |
+-------------------------+------------+
1 row in set (0.00 sec)
**innodb_flush_log_at_trx_commit** 主要控制了innodb將log buffer中的數據寫入日誌文件並flush磁盤的時 間點,取值分別爲0、一、2三個。
* 0,表示當事務提交時,不作日誌寫入操做,而是每秒鐘將log buffer中 的數據寫入日誌文件並flush磁盤一次;
* 1,則在每秒鐘或是每次事物的提交都會引發日誌文件寫入、 flush磁盤的操做,確保了事務的ACID;
* 2,每次事務提交引發寫入日誌文件的動做,但每秒鐘完 成一次flush磁盤操做。 實際測試發現,該值對插入數據的速度影響很是大,設置爲2時插入10000條記錄 只須要2秒,設置爲0時只須要1秒,而設置爲1時則須要229秒。所以,MySQL手冊也建議儘可能將插入操 做合併成一個事務,這樣能夠大幅提升速度。 根據MySQL手冊,在容許丟失最近部分事務的危險的前提 下,能夠把該值設爲0或2。

innodb_thread_concurrency = 0 此參數用來設置innodb線程的併發數量,默認值爲0表示不限制,若 要設置則與服務器的CPU核數相同或是cpu的核數的2倍,建議用默認設置,通常爲8.
innodb_log_buffer_size 此參數肯定些日誌文件所用的內存大小,以M爲單位。緩衝區更大能提升性能, 對於較大的事務,能夠增大緩存大小。
innodb_log_file_size = 50M 此參數肯定數據日誌文件的大小,以M爲單位,更大的設置能夠提升性能.
innodb_log_files_in_group = 3 爲提升性能,MySQL能夠以循環方式將日誌文件寫到多個文件。推薦設置爲3
read_buffer_size = 1M MySql 讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區, MySql會爲它分配一段內存緩衝區。若是對錶的順序掃描請求很是頻繁,而且你認爲頻繁掃描進行得太 慢,能夠經過增長該變量值以及內存緩衝區大小提升其性能。和 sort_buffer_size同樣,該參數對應的分 配內存也是每一個鏈接獨享。
read_rnd_buffer_size = 16M MySql 的隨機讀(查詢操做)緩衝區大小。當按任意順序讀取行時(例如, 按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySql會首先掃描一遍該緩衝,以免磁 盤搜索,提升查詢速度,若是須要排序大量數據,可適當調高該值。但MySql會爲每一個客戶鏈接發放該 緩衝空間,因此應儘可能適當設置該值,以免內存開銷過大。 注:順序讀是指根據索引的葉節點數據就 能順序地讀取所須要的行數據。隨機讀是指通常須要根據輔助索引葉節點中的主鍵尋找實際行數據,而 輔助索引和主鍵所在的數據段不一樣,所以訪問方式是隨機的。

bulk_insert_buffer_size = 64M 批量插入數據緩存大小,能夠有效提升插入效率,默認爲8M
binary log log-bin=/usr/local/mysql/data/mysql-bin binlog_cache_size = 2M //爲每一個session 分配的內 存,在事務過程當中用來存儲二進制日誌的緩存,提升記錄bin-log的效率。沒有什麼大事務,dml也不是很 頻繁的狀況下能夠設置小一點,若是事務大並且多,dml操做也頻繁,則能夠適當的調大一點。前者建議 是--1M,後者建議是:即 2--4M max_binlog_cache_size = 8M //表示的是binlog 可以使用的最大cache 內存大小 max_binlog_size = 512M //指定binlog日誌文件的大小,若是當前的日誌大小達到 max_binlog_size,還會自動建立新的二進制日誌。你不能將該變量設置爲大於1GB或小於4096字節。默 認值是1GB。在導入大容量的sql文件時,建議關閉sql_log_bin,不然硬盤扛不住,並且建議按期作刪 除。 expire_logs_days = 7 //定義了mysql清除過時日誌的時間。 二進制日誌自動刪除的天數。默認值爲 0,表示「沒有自動刪除」。 mysqladmin flush-logs 也能夠從新開始新的binary log
log_queries_not_using_indexes 開啓這個選項真實地記錄了返回全部行的查詢。

[root@mysql ~]#mysqlslap --defaults-file=/etc/my.cnf --concurrency=10 -iterations=1 --create-schema='test1' --query='select * from test1.tb1' -engine=innodb --number-of-queries=2000 -uroot -p123456 –verbose 
 顯示結果: Benchmark  
 Running for engine innodb  
 Average number of seconds to run all queries: 13.837 seconds  
 Minimum number of seconds to run all queries: 13.837 seconds  
 Maximum number of seconds to run all queries: 13.837 seconds  
 Number of clients running queries: 10  
 Average number of queries per client: 200 
 #優化以後執行mysqlslap工具進行測試
 [root@mysql ~]#mysqlslap --defaults-file=/etc/my.cnf --concurrency=10 -iterations=1 --create-schema='test1' --query='select * from test1.tb1' -engine=innodb --number-of-queries=2000 -uroot -p123456 –verbose 
 顯示結果: 
 Benchmark  
 Running for engine innodb  
 Average number of seconds to run all queries: 4.199 seconds  
 Minimum number of seconds to run all queries: 4.199 seconds  
 Maximum number of seconds to run all queries: 4.199 seconds  
 Number of clients running queries: 10 
 Average number of queries per client: 200
相關優化參數總結: 
[mysqld] 
slow_query_log = 1 
slow_query_log_file = /usr/local/mysql/data/slow-query.log 
long_query_time = 1 
log-queries-not-using-indexes 
max_connections = 1024 
back_log = 128 
wait_timeout = 60 
interactive_timeout = 7200 
key_buffer_size=256M 
query_cache_size = 256M 
query_cache_type=1 
query_cache_limit=50M 
max_connect_errors=20 
sort_buffer_size = 2M 
max_allowed_packet=32M 
join_buffer_size=2M 
thread_cache_size=200 
innodb_buffer_pool_size = 2048M 
innodb_flush_log_at_trx_commit = 1 
innodb_log_buffer_size=32M 
innodb_log_file_size=128M 
innodb_log_files_in_group=3 
log-bin=mysql-bin 
binlog_cache_size=2M 
max_binlog_cache_size=8M 
max_binlog_size=512M 
expire_logs_days=7 
read_buffer_size=1M 
read_rnd_buffer_size=16M 
bulk_insert_buffer_size=64M 
log-error = /usr/local/mysql/data/mysqld.err
相關文章
相關標籤/搜索