MySQL高速緩存啓動方法及參數詳解

默認配置下,MySQL的該功能是沒有啓動的,可能你經過show variables like '%query_cache%';會發現其變量have_query_cache的值是yes,MYSQL初學者很容易覺得這個參數爲YES就表明開啓了查詢緩存,其實是不對的,該參數表示當前版本的MYSQL是否支持Query Cache,其實是否開啓查詢緩存是看另一個參數的值:query_cache_size ,該值爲0,表示禁用query cache,而默認配置正是配置爲0。 mysql

配置方法: sql

在MYSQL的配置文件my.ini或my.cnf中找到以下內容: 緩存

# Query cache is used to cache SELECT results and later return them ide

# without actual executing the same query once again. Having the query 性能

# cache enabled may result in significant speed improvements, if your 測試

# have a lot of identical queries and rarely changing tables. See the 優化

# "Qcache_lowmem_prunes" status variable to check if the current value orm

# is high enough for your load. 內存

# Note: In case your tables change very often or if your queries are it

# textually different every time, the query cache may result in a

# slowdown instead of a performance improvement.

query_cache_size=0

以上信息是默認配置,其註釋意思是說,MYSQL的查詢緩存用於緩存select查詢結果,並在下次接收到一樣的查詢請求時,再也不執行實際查詢處理而直接返回結果,有這樣的查詢緩存能提升查詢的速度,使查詢性能獲得優化,前提條件是你有大量的相同或類似的查詢,而不多改變表裏的數據,不然沒有必要使用此功能。能夠經過Qcache_lowmem_prunes變量的值來檢查是否當前的值知足你目前系統的負載。注意:若是你查詢的表更新比較頻繁,並且不多有相同的查詢,最好不要使用查詢緩存。

具體配置方法:

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

2. 增長一行:query_cache_type=1

query_cache_type參數用於控制緩存的類型,注意這個值不能隨便設置,必須設置爲數字,可選項目以及說明以下:


若是設置爲0,那麼能夠說,你的緩存根本就沒有用,至關於禁用了。可是這種狀況下query_cache_size設置的大小系統是否要爲其分配呢,這個問題有待於測試?

若是設置爲1,將會緩存全部的結果,除非你的select語句使用SQL_NO_CACHE禁用了查詢緩存。

若是設置爲2,則只緩存在select語句中經過SQL_CACHE指定須要緩存的查詢。

OK,配置完後的部分文件以下:

query_cache_size=128M

query_cache_type=1

保存文件,從新啓動MYSQL服務,而後經過以下查詢來驗證是否真正開啓了:

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_size和query_cache_type的值是否跟咱們設的一致:

這裏query_cache_size的值是134217728,咱們設置的是128M,實際是同樣的,只是單位不一樣,能夠本身換算下:134217728 = 128*1024*1024。

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

總之,看到上邊的顯示錶示設置正確,可是在實際的查詢中是否可以緩存查詢,還須要手動測試下,咱們能夠經過show status like '%Qcache%';語句來測試,如今咱們開啓了查詢緩存功能,在執行查詢前,咱們先看看相關參數的值:

mysql> 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數量。

下邊咱們測試下:

好比執行以下查詢語句

mysql> select * from user where id = 2;

+----+-------+

| id | name |

+----+-------+

| 2 | test2 |

+----+-------+

1 row in set (0.02 sec)

而後執行show status like '%Qcache%',看看有什麼變化:

mysql> show status like '%Qcache%';

+-------------------------+-----------+

| Variable_name           | Value     |

+-------------------------+-----------+

| Qcache_free_blocks      | 1         |

| Qcache_free_memory      | 134207264 |

| Qcache_hits             | 0         |

| Qcache_inserts          | 1         |

| Qcache_lowmem_prunes    | 0         |

| Qcache_not_cached       | 3         |

| Qcache_queries_in_cache | 1         |

| Qcache_total_blocks     | 4         |

+-------------------------+-----------+

8 rows in set (0.00 sec)

對比前面的參數值,咱們發現Qcache_inserts變化了。Qcache_hits沒有變,下邊咱們在執行一樣的查詢
select * from user where id = 2,按照前面的理論分析:Qcache_hits應該等於1,而Qcache_inserts應該值不變(其餘參數的值變化暫時不關注,讀者能夠自行測試),再次執行:

show status like '%Qcache%',看看有什麼變化:

mysql> show status like '%Qcache%';

+-------------------------+-----------+

| Variable_name           | Value     |

+-------------------------+-----------+

| Qcache_free_blocks      | 1         |

| Qcache_free_memory      | 134207264 |

| Qcache_hits             | 1         |

| Qcache_inserts          | 1         |

| Qcache_lowmem_prunes    | 0         |

| Qcache_not_cached       | 4         |

| Qcache_queries_in_cache | 1         |

| Qcache_total_blocks     | 4         |

+-------------------------+-----------+

8 rows in set (0.00 sec)

相關文章
相關標籤/搜索