詳解MySQL查詢快取

來源:互聯網
上載者:User

詳解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,這是由它的系統結構所決定的。在應用時設定為多大合適,還是要根據實際情況而定。

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.