MySQL的查詢緩存並非緩存執行計划,而是查詢及其結果集,這就意味着只有相同的查詢操作才能命中緩存,因此MySQL的查詢緩存命中率很低,另一方面,對於大結果集的查詢,其查詢結果可以從cache中直接讀取,有效的提升了查詢效率。
那么如何設置緩存的大小呢?來看一下:
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 | 16106127360 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+-------------+ 6 rows in set (0.01 sec)
其中:
query_cache_type: 是否開啟緩存功能,取值為ON, OFF, DEMAND,默認值為ON
- 值為OFF或0時,查詢緩存功能關閉;
- 值為ON或1時,查詢緩存功能打開,SELECT的結果符合緩存條件即會緩存,否則,不予緩存,顯式指定SQL_NO_CACHE,不予緩存;
- 值為DEMAND或2時,查詢緩存功能按需進行,顯式指定SQL_CACHE的SELECT語句才會緩存;其它均不予緩存
query_cache_wlock_invalidate:表示當有其他客戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否返回cache結果還是等寫操作完成再讀表獲取結果。
query_cache_limit 指定單個查詢能夠使用的緩沖區大小,缺省為1M;
query_cache_min_res_unit為系統分配的最小緩存塊大小,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據查詢,就容易造成內存碎片和浪費;query_cache_size:表示緩存的大小。
了解了以上的指標后我們就可以在mysql的配置文件my.cnf中進行設置。然后重啟mysl服務器即可。在[mysqld]下面添加參數。一般是設置query_cache_size和query_cache_type兩項。
2、上面查看的是我們進行緩存的配置,它一般從配置文件中讀取值,但是有時候我們需要實時查看當前mysql中的數據緩存大小。
mysql> show status like '%qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031832 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 16489053 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+----------+ 8 rows in set (0.00 sec)
解釋:
Qcache_free_memory:緩存中的空閑內存。
Qcache_total_blocks:緩存中塊的數量。
Qcache_lowmem_prunes:緩存出現內存不足並且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個 數字在不斷增長,就表示可能碎片非常嚴重,或者內存很少。如何確定就需要查看Qcache_free_blocks和Qcache_free_memory 兩項指標。
3、清空緩存:
flush query cache命令
加大緩存有助於我們查詢的效率提高:
這里舉個例子:
mysql> use mob_adn Database changed mysql> select count(*) from creative_output; +----------+ | count(*) | +----------+ | 87151154 | +----------+ 1 row in set (3 min 18.29 sec) mysql> select count(*) from creative_output; +----------+ | count(*) | +----------+ | 87151154 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from creative_output; +----------+ | count(*) | +----------+ | 87151154 | +----------+ 1 row in set (0.00 sec)
可以看到緩存真的很厲害。
還有的同學會想到innodb_buffer_pool這個參數,兩者的作用與區別我會接着來講。
順便這里在講解一下SQL幾項優化(很好):
https://www.cnblogs.com/L-dongf/p/9163848.html