MySQL 查詢快取 query_cache_size

來源:互聯網
上載者:User

MySQL 查詢快取 query_cache_size

從 MySQL 4.0.1 開始,MySQL server 有一個重要的特徵:Query Cache。 當在使用中,查詢快取會儲存一個 SELECT 查詢的文本與被傳送到用戶端的相應結果。如果之後接收到一個同樣的查詢,伺服器將從查詢快取中檢索結果,而不是再次分析和執行這個同樣的查詢。

注意:查詢快取絕不返回到期資料。當資料被修改後,在查詢快取中的任何相關詞條均被轉儲清除。

在某些表並不經常更改,而你又對它執行大量的相同查詢時,查詢快取將是非常有用的。對於許多 WEB 伺服器使用大量的動態資訊,這是一個很典型的情況。

下面是查詢快取的一個效能資料。(這些結果的產生,是通過在一個 a Linux Alpha 2 x 500 MHz、2GB RAM 和 64MB 查詢快取上執行 MySQL 基準套件和到的):

如果你執行的所有查詢均是簡單的(比如從表中一行一行的選取);但是仍然是不同的,所以該查詢不能被緩衝,查詢快取處於活動時,開銷為 13%。這可以被看作是最差的情況。然而,在實際情況下,查詢是比我們的簡單樣本要複雜得多的,所以開銷通常顯著得低。
在只有一行記錄表中搜尋一行後,搜尋將快 238% 。這可以被認為是接近於對一個被緩衝的查詢所期望的最小的加速。
如果你希望禁用查詢快取,設定 query_cache_size=0。禁用了查詢快取,將沒有明顯的開銷。(在配置選項 --without-query-cache 的協助下,查詢快取可以被排除在外碼之外)
6.9.1 查詢快取如何運作
查詢在分析之前先被比較,因而

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 許可權。如果不是這種情況,緩衝的結果將不能被使用。

6.9.2 查詢快取設定
查詢快取為了 mysqld 添加了幾個 MySQL 系統變數,它可以在設定檔中被設定,或在啟動 mysqld 時的命令列上設定。

query_cache_limit 不緩衝大於這個值的結果。(預設為 1M)

query_cache_min_res_unit 這個變數從 4.1 被引進。 查詢的結果 (已被傳送到用戶端的資料) 在結果檢索期間被儲存到查詢快取中。因而,資料不會以一個大塊地處理。查詢快取在需要時分配塊用於處理這個資料,所以當一個塊被填充後,一個新的塊被分配。甚為記憶體配置操作是昂貴的,查詢快取以最小的尺寸 query_cache_min_res_unit 分配塊。當一個查詢執行完成,最後的結果塊被修整到實際資料的尺寸大小,以便未使用的記憶體被釋放。
query_cache_min_res_unit 的預設值為 4 KB,在大多資料情況下已夠用了。
如果你有許多查詢返回一個較小的結果,預設的塊尺寸可能會引起記憶體片段 (顯示為一個很大數量的空閑塊(Qcache_free_blocks),這將引起查詢快取不得不因缺乏記憶體(Qcache_lowmem_prunes)而從緩衝中刪除查詢)。在這種情況下,你應該減少 query_cache_min_res_unit。
如果你的主要查詢返回的是大的結果集(查看 Qcache_total_blocks 和 Qcache_queries_in_cache),你可以通過增加 query_cache_min_res_unit 來增加效能。然而,要小心不要將它設得太大。

query_cache_size 為了儲存老的查詢結果而分配的記憶體數量 (以位元組指定) 。如果設定它為 0 ,查詢緩衝將被禁止(預設值為 0 )。
query_cache_type 這個可以被設定為 (只能是數字) 選項  含義 
0  (OFF, 不緩衝或重新得到結果) 
1  (ON, 緩衝所有的結果,除了 SELECT SQL_NO_CACHE ... 查詢) 
2  (DEMAND, 僅緩衝 SELECT SQL_CACHE ... 查詢) 

在一個線程(串連)內,查詢快取的行為可以被改變。句法如下所示:

QUERY_CACHE_TYPE = OFF | ON | DEMAND QUERY_CACHE_TYPE = 0 | 1 | 2

選項  含義 
0 or OFF  不緩衝或重新得到結果 
1 or ON  緩衝所有的結果,除了 SELECT SQL_NO_CACHE ... 查詢 
2 or DEMAND  僅緩衝 SELECT SQL_CACHE ... 查詢 

6.9.3 在 SELECT 中的查詢快取選項
有兩個可能的查詢快取相關的參數可以在一個 SELECT 查詢中被指定:


選項  含義 
SQL_CACHE  如果 QUERY_CACHE_TYPE 為 DEMAND,允許該查詢被緩衝。如果 QUERY_CACHE_TYPE 為 ON,這是預設的。如果 QUERY_CACHE_TYPE 為 OFF,它不做任何事 
SQL_NO_CACHE  使這個查詢不被緩衝,不允許這個查詢被儲存到快取中 

6.9.4 查詢快取的狀態和維護
使用 FLUSH QUERY CACHE 命令,你可以整理查詢快取,以更好的利用它的記憶體。這個命令不會從緩衝中移除任何查詢。FLUSH TABLES 會轉儲清除查詢快取。

RESET QUERY CACHE 使命從查詢快取中移除所有的查詢結果。

你可以檢查查詢快取在你的 MySQL 是否被引進:

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.00 sec)
在 SHOW STATUS 中,你可以監視查詢快取的效能:

變數  含義 
Qcache_queries_in_cache  在緩衝中登入的查詢數目 
Qcache_inserts  被加入到緩衝中的查詢數目 
Qcache_hits  緩衝採樣數數目 
Qcache_lowmem_prunes  因為缺少記憶體而被從緩衝中刪除的查詢數目 
Qcache_not_cached  沒有被緩衝的查詢數目 (不能被緩衝的,或由於 QUERY_CACHE_TYPE) 
Qcache_free_memory  查詢快取的空閑記憶體總數 
Qcache_free_blocks  查詢快取中的空閑記憶體塊的數目 
Qcache_total_blocks  查詢快取中的塊的總數目 

Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached.

查詢快取使用變長的塊,因而 Qcache_total_blocks 和 Qcache_free_blocks 可能顯示查詢快取的片段。在 FLUSH QUERY CACHE 之後,只有剩餘一個單獨的(大的)空閑塊。

注意:每個查詢最小需要兩個塊(一個用於儲存查詢文本,另一個或多個用於儲存查詢結果)。同樣的,每個被一個查詢使用的表需要一個塊,但是,如果有兩個或更多的查詢使用同一張表,僅僅只需要分配一個塊就行了。

你可以使用狀態變數 Qcache_lowmem_prunes 來諧調查詢快取尺寸。它計數被從緩衝中移除的查詢,該查詢的移除是為了釋放記憶體,以緩衝建立的查詢。查詢快取使用一個 least recently used (LRU) 策略來判斷從緩衝中移除哪個查詢。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.