黃聰:MYSQL5.6緩存性能優化my.ini文件配置方案


使用MYSQL版本:5.6

[client]
……
default-character-set=gbk
default-storage-engine=MYISAM
max_connections=1000
max_connect_errors=500
back_log=200
interactive_timeout=7200
query_cache_size=128M
query_cache_type=1 …… table_open_cache
=4000 …… myisam_max_sort_file_size=50G myisam_sort_buffer_size=128M key_buffer_size=1024M read_buffer_size=512M

官方文檔:

http://dev.mysql.com/doc/refman/5.6/en/mysqld-option-tables.html

http://dev.mysql.com/doc/refman/5.6/en/server-default-changes.html

1、back_log

back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。也就是說,如果MySql的連接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。將會報:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進程超時。

back_log值不能超過TCP/IP連接的偵聽隊列的大小。若超過則無效,查看當前系統的TCP/IP連接的偵聽隊列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog目前系統為1024。對於Linux系統推薦設置為小於512的整數。

查看mysql 當前系統默認back_log值,命令:

show variables like 'back_log'; 查看當前數量

 

2、interactive_timeout

interactive_timeout是MySQL在等待一個活動連接關閉連接前等待的秒數。

wait_timeout是MySQL在等待一個非活動連接關閉連接前等待的秒數。

 

3、query_cache_size、query_cache_type

MYSQL的查詢緩存用於緩存select查詢結果,並在下次接收到同樣的查詢請求時,不再執行實際查詢處理而直接返回結果,有這樣的查詢緩存能提高查詢的速度,使查詢性能得到優化,前提條件是你有大量的相同或相似的查詢,而很少改變表里的數據,否則沒有必要使用此功能。可以通過Qcache_lowmem_prunes變量的值來檢查是否當前的值滿足你目前系統的負載。注意:如果你查詢的表更新比較頻繁,而且很少有 相同的查詢,最好不要使用查詢緩存。

具體配置方法:

1. 將query_cache_size設置為具體的大小,具體大小是多少取決於查詢的實際情況,但最好設置為1024的倍數,參考值32M。

2. 增加一行:query_cache_type=1

如果設置為0,那么可以說,你的緩存根本就沒有用,相當於禁用了。但是這種情況下query_cache_size設置的大小系統是否要為其分配呢,這個問題有待於測試?

如果設置為1,將會緩存所有的結果,除非你的select語句使用SQL_NO_CACHE禁用了查詢緩存。

如果設置為2,則只緩存在select語句中通過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             | 134217728 |

| query_cache_type             | ON        |

| query_cache_wlock_invalidate | OFF       |

+——————————+———–+

6 rows in set (0.00 sec)

主要看query_cache_sizequery_cache_type的值是否跟我們設的一致:

這里query_cache_size的值是134217728,我們設置的是128M,實際是一樣的,只是單位不同,可以自己換算下:134217728 = 128*1024*1024。

query_cache_type設置為1,顯示為ON,這個前面已經說過了。

總之,看到上邊的顯示表示設置正確,但是在實際的查詢中是否能夠緩存查詢,還需要手動測試下,我們可以通過show status like ‘%Qcache%’;語句來測試,現在我們開啟了查詢緩存功能,在執行查詢前,我們先看看相關參數的值:

show status like%Qcache%’;

+————————-+———–+

| Variable_name           | Value     |

+————————-+———–+

| Qcache_free_blocks      | 1         |

| Qcache_free_memory      | 134208800 |

| Qcache_hits             | 0         |

| Qcache_inserts          | 0         |

| Qcache_lowmem_prunes    | 0         |

| Qcache_not_cached       | 2         |

| Qcache_queries_in_cache | 0         |

| Qcache_total_blocks     | 1         |

+————————-+———–+

8 rows in set (0.00 sec)

這里順便解釋下這個幾個參數的作用:

Qcache_free_blocks:表示查詢緩存中目前還有多少剩余的blocks,如果該值顯示較大,則說明查詢緩存中的內存碎片過多了,可能在一定的時間進行整理。

Qcache_free_memory:查詢緩存的內存大小,通過這個參數可以很清晰的知道當前系統的查詢內存是否夠用,是多了,還是不夠用,DBA可以根據實際情況做出調整。

Qcache_hits:表示有多少次命中緩存。我們主要可以通過該值來驗證我們的查詢緩存的效果。數字越大,緩存效果越理想。

Qcache_inserts: 表示多少次未命中然后插入,意思是新來的SQL請求在緩存中未找到,不得不執行查詢處理,執行查詢處理后把結果insert到查詢緩存中。這樣的情況的次 數,次數越多,表示查詢緩存應用到的比較少,效果也就不理想。當然系統剛啟動后,查詢緩存是空的,這很正常。

Qcache_lowmem_prunes:該參數記錄有多少條查詢因為內存不足而被移除出查詢緩存。通過這個值,用戶可以適當的調整緩存大小。

Qcache_not_cached: 表示因為query_cache_type的設置而沒有被緩存的查詢數量。

Qcache_queries_in_cache:當前緩存中緩存的查詢數量。

Qcache_total_blocks:當前緩存的block數量。

 

4、table_open_cache

table_cache 參數設置表高速緩存的數目。每個連接進來,都會至少打開一個表緩存。因此, table_open_cache 的大小應與 max_connections 的設置有關。例如,對於 200 個並行運行的連接,應該讓表的緩存至少有 200 × N ,這里 N 是應用可以執行的查詢的一個聯接中表的最大數量。此外,還需要為臨時表和文件保留一些額外的文件描述符。

緩存機制

當 Mysql 訪問一個表時,如果該表在緩存中已經被打開,則可以直接訪問緩存;如果還沒有被緩存,但是在 Mysql 表緩沖區中還有空間,那么這個表就被打開並放入表緩沖區;如果表緩存滿了,則會按照一定的規則將當前未用的表釋放,或者臨時擴大表緩存來存放,使用表緩存的好處是可以更快速地訪問表中的內容。

參數調優

一般來說,可以通過查看數據庫運行峰值時間的狀態值 Open_tables 和 Opened_tables ,判斷是否需要增加 table_cache 的值(其中 open_tables 是當前打開的表的數量, Opened_tables 則是已經打開的表的數量)。即如果open_tables接近table_open_cache的時候,並且Opened_tables這個值在逐步增加,那就要考慮增加這個值的大小了。還有就是Table_locks_waited比較高的時候,也需要增加table_open_cache。

show global status like 'open%_tables';

如果Open_tables的值已經接近table_open_cache的值,且Opened_tables還在不斷變大,則說明mysql正在將緩存的表釋放以容納新的表,此時可能需要加大table_open_cache的值。對於大多數情況,

比較適合的值:

Open_tables / Opened_tables >= 0.85
Open_tables / table_open_cache <= 0.95

如果對此參數的把握不是很准,VPS管理百科給出一個很保守的設置建議:把MySQL數據庫放在生產環境中試運行一段時間,然后把參數的值調整得比Opened_tables的數值大一些,並且保證在比較高負載的極端條件下依然比Opened_tables略大。

在mysql默認安裝情況下,table_open_cache的值在2G內存以下的機器中的值默認時256到 512,如果機器有4G內存,則默認這個值是2048,但這決意味着機器內存越大,這個值應該越大,因為table_open_cache加大后,使得mysql對 SQL響應的速度更快了,不可避免的會產生更多的死鎖(dead lock),這樣反而使得數據庫整個一套操作慢了下來,嚴重影響性能。所以平時維護中還是要根據庫的實際情況去作出判斷,找到最適合你維護的庫的 table_open_cache值。

清空緩存

執行

flush tables;

命令將會清空當前所有緩存的表。

 

5、myisam_max_sort_file_size

# MySQL重建索引時所允許的最大臨時文件的大小 (當 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引會通過鍵值緩沖創建(更慢)

 

6、myisam_sort_buffer_size

# MyISAM表發生變化時重新排序所需的緩沖

 

7、key_buffer_size

1.單個key_buffer的大小不能超過4G,如果設置超過4G,就有可能遇到下面3個bug:

http://bugs.mysql.com/bug.php?id=29446

http://bugs.mysql.com/bug.php?id=29419

http://bugs.mysql.com/bug.php?id=5731

2.建議key_buffer設置為物理內存的1/4(針對MyISAM引擎),甚至是物理內存的30%~40%,如果key_buffer_size設置太大,系統就會頻繁的換頁,降低系統性能。因為MySQL使用操作系統的緩存來緩存數據,所以我們得為系統留夠足夠的內存;在很多情況下數據要比索引大得多。

3.如果機器性能優越,可以設置多個key_buffer,分別讓不同的key_buffer來緩存專門的索引

上面只是對"新手"來說的,我們還可以更深入地優化key_buffer_size,使用"show status"來查看"Key_read_requestsKey_readsKey_write_requests  以及Key_writes ",以調整到更適合你的應用的大小,Key_reads/Key_read_requests的大小正常情況下得小於0.01

 

8、read_buffer_size

# MySql讀入緩沖區大小。對表進行順序掃描的請求將分配一個讀入緩沖區,MySql會為它分配一段內存緩沖區。read_buffer_size變量控制這一緩沖區的大小。如果對表的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內存緩沖區大小提高其性能。和sort_buffer_size一樣,該參數對應的分配內存也是每個連接獨享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM