Mysql 查詢緩存

jopen 10年前發布 | 12K 次閱讀 MySQL 數據庫服務器

Mysql 查詢緩存
查詢緩存的作用就是當查詢接收到一個和之前同樣的查詢,服務器將會從查詢緩存種檢索結果,而不是再次分析和執行上次的查詢。這樣就大大提高了性能,節省時間。
1.配置查詢緩存
修改配置文件,修改[mysqld]下的query_cache_size和query_cache_type(如果沒有則添加)。其中 query_cache_size表示緩存的大小,而query_cache_type有3個值,表示緩存那種類  型的select結果集,query_cache_type各個值如下:
0或off關閉緩存
1或on開啟緩存,但是不保存使用sql_no_cache的select語句,如不緩存select  sql_no_cache name from wei where id=2
2或demand開啟有條件緩存,只緩存帶sql_cache的select語句,緩存select  sql_cache name from wei where id=4
例子的配置為下,配置完成重啟Mysql服務器即可。

</div> </div>

    query_cache_size=10M  
    query_cache_type=1  

可以用如下命令查看是否開啟,其中have_query_cache為是否開啟,query_cache_limit 指定單個查詢能夠使用的緩沖區大小,缺省為1M;query_cache_min_res_unit為系統分配的最小緩存塊大小,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據 查詢,就容易造成內存碎片和浪費;query_cache_size和query_cache_type就是上面我們的配置;query_cache_wlock_invalidate表示當有其他客戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否返回cache結果還是等寫操作完成再讀表獲取結果。

</div> </div>

    mysql> select  count() from wei ;
+----------+
| count(
) |
+----------+
| 4194304 |
+----------+
1 row in set (3.92 sec)

mysql> select  count(*) from wei ;  
+----------+  
| count(*) |  
+----------+  
|  4194304 |  
+----------+  
1 row in set (0.00 sec)  </pre><br />

2.測試
我們先執行一次,select  count(*) from wei ;然后再執行一次,可以看出第二次用的時間遠遠低于第一次的執行,因為第二次從緩存中讀取了select結果。

</div> </div>

    mysql> select  count() from wei ;
+----------+
| count(
) |
+----------+
| 4194304 |
+----------+
1 row in set (3.92 sec)

mysql> select  count(*) from wei ;  
+----------+  
| count(*) |  
+----------+  
|  4194304 |  
+----------+  
1 row in set (0.00 sec)  </pre><br />


我們可以通過如下命令查看現在緩存的情況

    mysql> show status like 'qcache%';  
    +-------------------------+----------+  
    | Variable_name           | Value    |  
    +-------------------------+----------+  
    | Qcache_free_blocks      | 1        |  
    | Qcache_free_memory      | 10475424 |  
    | Qcache_hits             | 1        |  
    | Qcache_inserts          | 1        |  
    | Qcache_lowmem_prunes    | 0        |  
    | Qcache_not_cached       | 0        |  
    | Qcache_queries_in_cache | 1        |  
    | Qcache_total_blocks     | 4        |  
    +-------------------------+----------+  
    8 rows in set (0.00 sec)  
</div> </div>
其中各個參數的意義如下:
Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而得到一個空閑塊。
Qcache_free_memory:緩存中的空閑內存。
Qcache_hits:每次查詢在緩存中命中時就增大
Qcache_inserts:每次插入一個查詢時就增大。命中次數除以插入次數就是不中比率。
Qcache_lowmem_prunes:緩存出現內存不足并且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個 數字在不斷增長,就表示可能碎片非常嚴重,或者內存很少。(上面的 free_blocks和free_memory可以告訴您屬于哪種情況)
Qcache_not_cached:不適合進行緩存的查詢的數量,通常是由于這些查詢不是 SELECT 語句或者用了now()之類的函數。
Qcache_queries_in_cache:當前緩存的查詢(和響應)的數量。
Qcache_total_blocks:緩存中塊的數量。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!