mysql查詢緩存清除
當在使用中,查詢緩存會存儲一個 SELECT 查詢的文本與被傳送到客戶端的相應結果。如果之後接收到一個同樣的查詢,伺服器將從查詢緩存中檢索結果,而不是再次分析和執行這個同樣的查詢。
注意:查詢緩存絕不返回過期數據。當數據被修改後,在查詢緩存中的任何相關詞條均被轉儲清除。
在某些表並不經常更改,而你又對它執行大量的相同查詢時,查詢緩存將是非常有用的。對於許多 WEB 伺服器使用大量的動態信息,這是一個很典型的情況。
下面是查詢緩存的一個性能數據。(這些結果的產生,是通過在一個 a linux Alpha 2 x 500 MHz、2GB RAM 和 64MB 查詢緩存上執行 MySQL 基準套件和到的):
如果你執行的所有查詢均是簡單的(比如從表中一行一行的選取);但是仍然是不同的,所以該查詢不能被緩沖,查詢緩存處於活動時,開銷為 13%。這可以被看作是最差的情況。然而,在實際情況下,查詢是比我們的簡單示例要復雜得多的,所以開銷通常顯著得低。
在只有一行記錄表中搜索一行後,搜索將快 238% 。這可以被認為是接近於對一個被緩沖的查詢所期望的最小的加速。
如果你希望禁用查詢緩存,設置 query_cache_size=0。禁用了查詢緩存,將沒有明顯的開銷。(在配置選項 --without-query-cache 的幫助下,查詢緩存可以被排除在外碼之外)
查詢在分析之前先被比較,因而
SELECT * FROM tbl_name和Select * from tbl_name
對於查詢緩存被當作是不同的查詢,因而查詢需要嚴格的一致(位元組對位元組的),才會被認為是同樣的。 另外,如果一個客戶端使用一個新的連接協議格式或不同於其它客戶端的另一個字元集,一個查詢將被視為不同的。
使用不同資料庫的,使用不同協議版本的,或使用不同的預設字元串的查詢將被認為是不同的查詢,並將分別的緩沖。
高速緩沖不對 SELECT CALC_ROWS … 和 SELECT FOUND_ROWS() … 類型的查詢起作用,因為找到的行的數目也是被存儲在緩沖里的。
如果查詢結果被從查詢緩存中返回,那麼狀態變數 Com_select 將不會被增加,但是 Qcache_hits 卻會增加。
查看章節 6.9.4 查詢緩存的狀態和維護。
如果一個表發生的改變 (INSERT, UPDATE, DELETE, TRUNCATE, ALTER 或 DROP TABLE|DATABASE),那麼所有這張表使用的緩沖的查詢(可能通過一個 MRG_MyISAM 表!)將被得失效,並從緩沖中移除。
InnoDB 表的事務所做的更改將在一個 COMMIT 被完成時,使數據失效。
如果一個查詢包括下面的函數,它將不能被緩沖:
函數 函數 函數
User-Defined Functions CONNECTION_ID FOUND_ROWS
GET_LOCK RELEASE_LOCK LOAD_FILE
MASTER_POS_WAIT NOW SYSDATE
CURRENT_TIMESTAMP CURDATE CURRENT_DATE
CURTIME CURRENT_TIME DATABASE
ENCRYPT (只有一個參數調用) LAST_INSERT_ID RAND
UNIX_TIMESTAMP (無參數調用) USER BENCHMARK
如果一個查詢包含用戶變數,引用 MySQL 系統資料庫,或下列之一的格式,SELECT … IN SHARE MODE, SELECT … INTO OUTFILE …, SELECT … INTO DUMPFILE … 或 SELECT * FROM AUTOINCREMENT_FIELD IS NULL (檢索最後一個插入 ID - ODBC 語句),該查詢亦不可以被緩存。
然而,FOUND ROWS() 將返回正確的值,即使先前的查詢是從緩存中讀取的。
萬一一個查詢不使用任何錶,或使用臨時表,或用戶對任何相關表有一個列許可權,那麼查詢將不會被緩存。
在一個查詢從查詢緩存中讀取前,MySQL 將檢查用戶對所有相關的資料庫和表有 SELECT 許可權。
『貳』 mysql 中 reset query cache 和 flush query cache 有啥區別嗎
查詢緩區的碎片整理
查詢緩存使用一段時間之後,一般都會出現內存碎片,為此需要監控相關狀態值,並且定期進行內存碎片的整理,碎片整理的操作語句:FLUSH QUERY CACHE;
清空查詢緩存的數據
那些操作操作可能觸發查詢緩存,把所有緩存的信息清空,以避免觸發或需要的時候,知道如何做,二類可觸發查詢緩存數據全部清空的命令:
(1).RESET QUERY CACHE;
(2).FLUSH TABLES;
『叄』 怎麼查看mysql緩存了
可以通過如下命令查看現在緩存的情況
[java]view plain
mysql>showstatuslike'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|
+-------------------------+----------+
8rowsinset(0.00sec)
其中各個參數的意義如下:
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:緩存中塊的數量。
『肆』 怎樣清理mysql資料庫的緩存
如果資料庫是安裝在你機器上的 那麼你可以暫時把MYSQL關閉 然後進入安裝目錄 找到data文件夾 這裡面就是放置資料庫文件的。。你會看到data裡面每一個文件夾都對應你一個資料庫名稱 把他們刪除就好了 就徹底沒了 不過可別把mysql這個文件夾刪了 還有別的文件 比如.err別亂刪哦。
如果這個你不會 或者說文件在使用刪除不了 那麼你就用mysql的可視化工具 比如mysql-front 5.1 進去刪除 效果都是一樣。
『伍』 mysql查詢時怎麼不用緩存
設置好查詢緩存的大小就行了。比如設置個20MB.
SET GLOBAL QUERY_CACHE_SIZE=20000000;
mysql會將查詢SQL和結果集存到緩存中,等下次遇到相同的SQL語句時,結果集從緩存中讀取。
不設置就不用緩存了
『陸』 MySQL緩存
mysql 開啟查詢緩存可以有兩種方法來開啟一種是使用set命令來進行開啟,另一種是直接修改my.ini文件來直接設置都是非常的簡單的哦。
開啟緩存,設置緩存大小,具體實施如下:
windows下是my.ini,linux下是my.cnf;
在配置文件的最後追加上:
需要重啟mysql生效;
b) 開啟緩存,兩種方式:
a)使用mysql命令:
如果報錯:
Query cache is disabled; restart the server with query_cache_type=1 to enable it,還是老老實實的該配置文件,然後重啟吧,原因如下:
查看是否設置成功
show variables like "%query_cache%" 查看是否設置成功:
當然如果你的數據表有更新怎麼辦,沒關系mysql默認會和這個表有關系的緩存刪掉,下次查詢的時候會直接讀表然後再緩存
下面是一個簡單的例子:
以上的相關內容就是對mysql緩存查詢和設置的介紹,望你能有所收獲。
一般,我們會把 query_cache_type 設置為 ON,默認情況下應該是ON
query_cache_type有3個值 0代表關閉查詢緩存OFF,1代表開啟ON,2(DEMAND)代表當sql語句中有SQL_CACHE關鍵詞時才緩存,如:
這樣 當我們執行 select id,name from tableName; 這樣就會用到查詢緩存。
①在 query_cache_type 打開的情況下,如果你不想使用緩存,需要指明
select sql_no_cache id,name from tableName;
②當sql中用到mysql函數,也不會緩存
當然也可以禁用查詢緩存: mysql> set session query_cache_type=off;
上面的顯示,表示設置查詢緩存是可用的。
表示查詢緩存大小,也就是分配內存大小給查詢緩存,如果你分配大小為0,
那麼 第一步 和 第二步 起不到作用,還是沒有任何效果。
上面是 mysql6.0設置默認的,之前的版本好像默認是0的,那麼就要自己設置下。
設置
這里是設置1M左右,900多K。
再次查看下:
顯示我們設置新的大小,表示設置成功。
例如: 如果查詢結果很大, 也緩存????這個明顯是不可能的。
MySql 可以設置一個最大的緩存值,當你查詢緩存數結果數據超過這個值就不會
進行緩存。預設為1M,也就是超過了1M查詢結果就不會緩存。
這個是默認的數值,如果需要修改,就像設置緩存大小一樣設置,使用set
重新指定大小。
好了,通過4個步驟就可以 打開了查詢緩存,具體值的大小和查詢的方式 這個因不同
的情況來指定了。
mysql查詢緩存相關變數
MySQL 提供了一系列的 Global Status 來記錄 Query Cache 的當前狀態,具體如下:
Qcache_free_blocks:目前還處於空閑狀態的 Query Cache 中內存 Block 數目
Qcache_free_memory:目前還處於空閑狀態的 Query Cache 內存總量
Qcache_hits:Query Cache 命中次數
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,也就是沒有命中的次數
Qcache_lowmem_prunes:當 Query Cache 內存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對象使用的次數
Qcache_not_cached:沒有被 Cache 的 SQL 數,包括無法被 Cache 的 SQL 以及由於 query_cache_type 設置的不會被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數量
Qcache_total_blocks:Query Cache 中總的 Block 數量
檢查是否從查詢緩存中受益的最簡單的辦法就是檢查緩存命中率
當伺服器收到SELECT 語句的時候,Qcache_hits 和Com_select 這兩個變數會根據查詢緩存
的情況進行遞增
查詢緩存命中率的計算公式是:Qcache_hits/(Qcache_hits + Com_select)。
query_cache_min_res_unit的配置是一柄」雙刃劍」,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據 查詢,就容易造成內存碎片和浪費。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數據量的話。
查詢緩存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說明query_cache_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且 Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
示例伺服器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
查詢緩存可以看做是SQL文本和查詢結果的映射。如果第二次查詢的SQL和第一次查詢的SQL完全相同(注意必須是完全相同,即使多一個空格或者大小寫不同都認為不同)且開啟了查詢緩存,那麼第二次查詢就直接從查詢緩存中取結果,可以通過下面的SQL來查看緩存命中次數(是個累加值):
另外即使完全相同的SQL,如果使用不同的字元集、不同的協議等也會被認為是不同的查詢而分別進行緩存。
在表的結構或數據發生改變時,查詢緩存中的數據不再有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會導致緩存數據失效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
可以使用下面三個SQL來清理查詢緩存:
1、FLUSH QUERY CACHE; // 清理查詢緩存內存碎片。
2、RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
3、FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。
Query Cache是MySQL Server層的一個非常好的特性,對於小數據集或訪問量非常集中的應用場景,有非常好的性能提升,但是Query Cache引入了一些新的問題,而且大部分場景下比較雞肋,官方打算棄用了
參考:
https://www.cnblogs.com/wangzhuxing/p/5223881.html
https://www.cnblogs.com/lixiuran/archive/2014/03/08/3588654.html
