mysql是否有缓存区_Mysql查询高速缓存区
為了提高查詢速度,Mysql會維護一個內存區域(官方文檔指出,大小至少41984B)對查詢結果進行緩存,當查詢時發現緩存區里有數據則直接返回結果而不用去執行sql語句。
查詢命中的條件
每個緩存查詢至少需要兩個塊(一個塊用于查詢文本,一個或多個塊用于查詢結果)。并且,每一個查詢使用的每個表需要一個塊。但是,如果兩個或多個查詢使用相同的表,僅需要分配一個塊。
對于兩個查詢語句是否相同的判定,Mysql是比較嚴格,查詢必須是完全相同的(逐字節相同)才能夠被認為是相同的。另外,同樣的查詢字符串由于其它原因可能認為是不同的。使用不同的數據庫、不同的協議版本或者不同 默認字符集的查詢被認為是不同的查詢并且分別進行緩存。例如,以下兩個查詢是不相同的:
SELECT * FROM tbl_name
Select * from tbl_name
緩沖區配置
在Mysql中,設置緩沖區大小命令為:
mysql>SET GLOBAL query_cache_size = 41984;
如果設置的query_cache_size小于41984,則會設置失敗,并自動把它置為0。如果設置為0則表示不使用緩沖區。
當query_cache_size大于0的情況下,并不能保證緩沖區會被使用,還必須根據變量query_cache_type來決定,該變量有3中狀態,分別代表3中不同緩沖方式:
0或OFF--------將阻止緩存或查詢緩存結果。
1或ON---------將允許緩存,以SELECT SQL_NO_CACHE開始的查詢語句除外。
2或DEMAND--------僅對以SELECT SQL_CACHE開始的那些查詢語句啟用緩存。
設置方式如下:
mysql>?SET SESSION query_cache_type = OFF;
查詢結果的內存大小分配
要控制可以被緩存的具體查詢結果的最大值,應設置query_cache_limit變量。 默認值是1MB。
當一個查詢結果(返回給客戶端的數據)從查詢緩沖中提取期間,它在查詢緩存中排序。因此,數據通常不在大的數據塊中處理。查詢緩存根據數據排序要求分配數據塊,因此,當一個數據塊用完后分配一個新的數據塊。因為內存分配操作是昂貴的(費時的),所以通過query_cache_min_res_unit系統變量給查詢緩存分配最小值。當查詢執行時,最新的結果數據塊根據實際數據大小來確定,因此可以釋放不使用的內存。根據你的服務器執行查詢的類型,你會發現調整query_cache_min_res_unit變量的值是有用的:
query_cache_min_res_unit默認值是4KB。這應該適合大部分情況。
如果你有大量返回小結果數據的查詢,默認數據塊大小可能會導致內存碎片,顯示為大量空閑內存塊。由于缺少內存,內存碎片會強制查詢緩存從緩存內存中修整(刪除)查詢。這時,你應該減少query_cache_min_res_unit變量的值。空閑塊和由于修整而移出的查詢的數量通過Qcache_free_blocks和Qcache_lowmem_prunes變量的值給出。
如果大量查詢返回大結果(檢查?Qcache_total_blocks和Qcache_queries_in_cache狀態變量),你可以通過增加query_cache_min_res_unit變量的值來提高性能。但是,注意不要使它變得太大。
也就是說,則給查詢結果分配緩沖區大小時,并不是再等待查詢結果返回后根據結果大小來分配空間,而是先根據query_cache_min_res_unit分配一個內存,待結果返回后直接放入內存中。這時候分3種情況考慮:
如果(查詢結果的大小=query_cache_min_res_unit),則直接把結果存入到該緩沖區中。
如果(查詢結果的大小
如果(查詢結果的大小>query_cache_min_res_unit),則需要再分配內存空間來存放結果
查詢高速緩沖狀態和維護
可以使用下面的語句檢查MySQL服務器是否提供查詢緩存功能:
mysql>?SHOW VARIABLES LIKE ‘have_query_cache‘;
+------------------+-------+
| Variable_name??? | Value |
+------------------+-------+
| have_query_cache | YES?? |
+------------------+-------+
可以使用FLUSH QUERY CACHE語句來清理查詢緩存碎片以提高內存使用性能。該語句不從緩存中移出任何查詢。
RESET QUERY CACHE語句從查詢緩存中移出所有查詢。FLUSH TABLES語句也執行同樣的工作。
為了監視查詢緩存性能,使用SHOW STATUS查看緩存狀態變量:
mysql> SHOW STATUS LIKE ‘Qcache%‘;
+-------------------------+--------+
|變量名?????????????????? |值 |
+-------------------------+--------+
| Qcache_free_blocks????? | 36???? |
| Qcache_free_memory????? | 138488 |
| Qcache_hits???????????? | 79570? |
| Qcache_inserts????????? | 27087? |
| Qcache_lowmem_prunes??? | 3114?? |
| Qcache_not_cached?????? | 22989? |
| Qcache_queries_in_cache | 415??? |
| Qcache_total_blocks???? | 912??? |
+-------------------------+--------+
清除緩沖區釋放空間
查詢緩存使用長度可變塊,因此Qcache_total_blocks和Qcache_free_blocks可以顯示查詢緩存內存碎片。執行FLUSH QUERY CACHE后,只保留一個空閑塊。
mysql>FLUSH QUERY CACHE;
內存置換策略
查詢緩沖區使用最近最少使用(LRU)策略來確定哪些查詢從緩沖區中移出(根據Qcache_lowmem_prunes狀態變量提供的信息能夠幫助你你調整查詢緩存的大小。它計算為了緩存新的查詢而從查詢緩沖區中移出到自由內存中的查詢的數目)
原文:http://www.cnblogs.com/agindage/p/4682331.html
總結
以上是生活随笔為你收集整理的mysql是否有缓存区_Mysql查询高速缓存区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql generic安装_MySQ
- 下一篇: mysql 慢查询sql实例_Mysql