MySQL的查詢緩存並不是緩存執行計劃,而是查詢及其結果集,這就意味着只有相同的查詢操做才能命中緩存,所以MySQL的查詢緩存命中率很低,另外一方面,對於大結果集的查詢,其查詢結果能夠從cache中直接讀取,有效的提高了查詢效率。html
那麼如何設置緩存的大小呢?來看一下:mysql
一、在mysql客戶端命令行中咱們能夠這麼查看緩存是否開啓以及緩存設置的大小:sql
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:表示緩存的大小。spa
瞭解了以上的指標後咱們就能夠在mysql的配置文件my.cnf中進行設置。而後重啓mysl服務器便可。在[mysqld]下面添加參數。通常是設置query_cache_size和query_cache_type兩項。命令行
二、上面查看的是咱們進行緩存的配置,它通常從配置文件中讀取值,可是有時候咱們須要實時查看當前mysql中的數據緩存大小。code
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 兩項指標。
三、清空緩存:
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