MySQL 查詢緩存存儲(chǔ) SELECT 查詢的文本以及發(fā)送給客戶端的響應(yīng)結(jié)果幌氮。如果隨后收到一個(gè)相同的查詢糟红,服務(wù)器從查詢緩存中重新得到查詢結(jié)果纸兔,而不再需要解析和執(zhí)行查詢誓沸。如果有一個(gè)不經(jīng)常改變的表并且服務(wù)器收到該表的大量相同查詢,查詢緩存在這樣的應(yīng)用環(huán)境中十分有用塔鳍。
查詢緩存 SELECT 選項(xiàng)
SQL_CACHE
如果 query_cache_type
系統(tǒng)變量的值是 ON
或 DEMAND
伯铣,查詢結(jié)果將被緩存。示例:
SELECT SQL_CACHE pid, title, price FROM product;
SQL_NO_CACHE
查詢結(jié)果不被緩存轮纫。示例:
SELECT SQL_NO_CACHE pid, title, price FROM product;
查詢緩存的工作原理
查詢必須是完全相同的(逐字節(jié)相同)才能夠被認(rèn)為是相同的腔寡,因此下面的兩個(gè)查詢被查詢緩存認(rèn)為是不相同的:
SELECT * FROM tbl_name;
Select * from tbl_name;
如果一個(gè)表被更改了,那么使用那個(gè)表的所有緩存查詢將不再有效掌唾,并且從緩沖區(qū)中移出放前。這包括那些映射到改變了的表的使用 MERGE 表的查詢忿磅。一個(gè)表可以被許多類型的語句更改,例如:INSERT凭语、UPDATE葱她、DELETE、TRUNCATE似扔、ALTER TABLE吨些、DROP TABLE或DROP DATABASE。
另外炒辉,如果一個(gè)查詢語句包含下面函數(shù)中的任意一個(gè)豪墅,它也不會(huì)被緩存:
- | - | - |
---|---|---|
BENCHMARK() | CONNECTION_ID() | CURDATE() |
CURRENT_DATE() | CURRENT_TIME() | CURRENT_TIMESTAMP() |
CURTIME() | DATABASE() | 帶一個(gè)參數(shù)的ENCRYPT() |
FOUND_ROWS() | GET_LOCK() | LAST_INSERT_ID() |
LOAD_FILE() | MASTER_POS_WAIT() | NOW() |
RAND() | RELEASE_LOCK() | SYSDATE() |
不帶參數(shù)的UNIX_TIMESTAMP() | USER() |
在下面的這些條件下,查詢也不會(huì)被緩存:
- 引用自定義函數(shù)(UDFs)黔寇。
- 引用自定義變量但校。
- 引用mysql系統(tǒng)數(shù)據(jù)庫(kù)中的表。
- 下面方式中的任何一種:
- SELECT ...IN SHARE MODE
- SELECT ...FOR UPDATE
- SELECT ...INTO OUTFILE ...
- SELECT ...INTO DUMPFILE ...
- SELECT * FROM ...WHERE autoincrement_col IS NULL
- 使用TEMPORARY表啡氢。
- 不使用任何表。
- 用戶沒有某個(gè)表的列級(jí)權(quán)限术裸。
查詢緩存配置
可以使用下面的語句檢查MySQL服務(wù)器是否提供查詢緩存功能:
SHOW VARIABLES LIKE 'have_query_cache';
變量名 | 值 |
---|---|
have_query_cache | YES |
所有查詢緩存系統(tǒng)變量名以 query_cache_
開頭倘是,當(dāng)啟動(dòng) mysqld 時(shí),這些變量可以在選項(xiàng)文件或者命令行中設(shè)置袭艺〔笳福可以使用下面的語句查看MySQL服務(wù)器的查詢緩存變量:
SHOW VARIABLES LIKE 'query_cache_%';
query_cache_limit
單個(gè)結(jié)果集所被允許緩存的最大值,默認(rèn)值為1048576(1MB)猾编。
query_cache_min_res_unit
每個(gè)被緩存的結(jié)果集要占用的最小內(nèi)存(字節(jié))瘤睹,默認(rèn)值為4096(4KB)。
query_cache_size
為緩存查詢結(jié)果分配的內(nèi)存大小答倡。默認(rèn)值為0轰传,即禁用查詢緩存。請(qǐng)注意即使 query_cache_type 設(shè)置為 0 也將分配此數(shù)量的內(nèi)存瘪撇。
query_cache_type
設(shè)置查詢緩存類型获茬,默認(rèn)值為ON。設(shè)置GLOBAL值可以設(shè)置后面的所有客戶端連接的類型倔既∷∏客戶端可以設(shè)置SESSION值以影響他們自己對(duì)查詢緩存的使用。下面的表顯示了可能的值:
選項(xiàng) | 描述 |
---|---|
0 或 OFF | 不要緩存查詢結(jié)果渤涌。 注意:這樣不會(huì)取消分配的查詢緩存區(qū)佩谣。 要想取消,應(yīng)將query_cache_size設(shè)置為0实蓬。 |
1 或 ON | 緩存除了以 SELECT SQL_NO_CACHE 開頭的所有查詢結(jié)果茸俭。 |
2 或 DEMAND | 只緩存以 SELECT SQL_CACHE 開頭的查詢結(jié)果吊履。 |
查詢緩存狀態(tài)和維護(hù)
可以使用 FLUSH QUERY CACHE
語句來清理查詢緩存碎片以提高內(nèi)存使用性能。該語句不從緩存中移出任何查詢瓣履。RESET QUERY CACHE
語句從查詢緩存中移出所有查詢率翅。FLUSH TABLES
語句也執(zhí)行同樣的工作。
為了監(jiān)視查詢緩存性能袖迎,使用 SHOW STATUS
查看緩存狀態(tài)變量:
SHOW STATUS LIKE 'Qcache%';
變量名 | 值 | 說明 |
---|---|---|
Qcache_free_blocks | 36 | 查詢緩存內(nèi)自由內(nèi)存塊的數(shù)量冕臭。 |
Qcache_free_memory | 138488 | 用于查詢緩存的自由內(nèi)存的數(shù)量。 |
Qcache_hits | 79570 | 查詢緩存被訪問的次數(shù)燕锥。 |
Qcache_inserts | 27087 | 加入到緩存的查詢數(shù)量辜贵。 |
Qcache_lowmem_prunes | 3114 | 由于內(nèi)存較少?gòu)木彺鎰h除的查詢數(shù)量。 |
Qcache_not_cached | 22989 | 非緩存查詢數(shù)(不可緩存归形,或由于query_cache_type設(shè)定值未緩存)托慨。 |
Qcache_queries_in_cache | 415 | 登記到緩存內(nèi)的查詢的數(shù)量。 |
Qcache_total_blocks | 912 | 查詢緩存內(nèi)的總塊數(shù)暇榴。 |