詳解MySQL查詢快取
查詢快取是指儲存使用SELECT文法查詢到的返回到用戶端的文本。當相同的請求再次發生時,會從查詢快取中擷取資料,而非再執行一遍查詢。查詢快取是共用Session會話的,所以一個用戶端的請求可能與另一個用戶端的請求得到相同的結果。
當伺服器頻繁收到相同的請求而資料庫中的表資料變化頻率又不高,查詢快取是非常有用的,它可以大大提高應用程式的訪問效率。很多Web伺服器利用這一原理基於資料庫的內容動態產生頁面。
查詢快取並不會返回到期的資料,當資料庫中的表資料發生變化時,相關的查詢快取會自動清除。但是查詢快取並不會在多個mysqld伺服器執行個體中更新同一個表的資料時有效。
查詢快取對於儲存在多個資料庫分區表中的資料是無效的。如果查詢涉及多個資料庫分區表,查詢快取會自動失效。
如果要禁用查詢快取的話,只需在啟動時將query_cache_size的大小設定為0即可。
查詢快取在一定情況下會提升系統的效能,但並不代表在任何情況下都會提升系統的效能,某些情況下,甚至可能會降低系統的效能。如
1)人們對於級區設定查詢快取的分歧很大,有些人認為可能超出了啟用它的好處。查詢快取的大小設定為幾十兆的時候通常是有效,但是設定成幾百兆的時候就不一定了。
2)在伺服器超負荷時使用查詢快取是非常有效。一個由多個SELECT組合成的複雜查詢使用查詢快取的效率肯定是非常高效的,但如果有頻繁插入資料的話,不使用緩衝的話比起使用查詢快取效率要高的多。
查詢快取的執行原理
對於下面這兩種查詢,查詢快取會當作兩種不同形式的查詢,因為查詢快取會嚴格比較兩次查詢的位元組是否完全相同。對於不同的字串,不同的資料表,不同的協議版本,不同的字元集都會當作不同的查詢。
SELECT * FROM tbl_nameSelect * from tbl_name |
在以下情況下並不適合使用查詢快取
1)查詢是外部查詢的一個子查詢
2)在預存程序,觸發器或函數中執行的查詢
如果資料表發生變化,如增加/修改/刪除表結構或表資料,都會導致查詢快取失效,緩衝的資料會自動從緩衝中清除。
當查詢快取包含了以下函數時,查詢快取並不會有效。
查詢快取不適用的情況
1)查詢使用使用者自訂的函數或預存程序。
2)查詢包含了使用者變數或本機存放區的程式變數。
3)涉及到資料庫中的mysql,INFORMATION_SCHEMA和performance——schema表。
4)查詢涉及到資料庫分區表。
5)查詢是如下的類型:
SELECT ... LOCK IN SHARE MODESELECT ... FOR UPDATESELECT ... INTO OUTFILE ...SELECT ... INTO DUMPFILE ...SELECT * FROM ... WHERE autoincrement_col IS NULL |
6)查詢用到了暫存資料表。
7)查詢沒有用到資料表。
8)查詢包含了警告。
9)使用者查詢的表中擁有特定的許可權。
使用查詢快取和不使用查詢快取的兩種方式
SELECT SQL_CACHE id, name FROM customer;SELECT SQL_NO_CACHE id, name FROM customer; |
配置查詢快取
當查詢快取query_cache_size設定為一個非0的數值時,最小的容量是40KB,這是由它的系統結構所決定的。在應用時設定為多大合適,還是要根據實際情況而定。
本文永久更新連結地址: