您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL怎樣查詢緩存,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
從 MySQL 4.0.1 開始,MySQL SERVER
有一個重要的特征:Query Cache
。 當(dāng)在使用中,查詢緩存會存儲一個 select
查詢的文本與被傳送到客戶端的相應(yīng)結(jié)果。如果之后接收到一個同樣的查詢,服務(wù)器將從查詢緩存中檢索結(jié)果,而不是再次分析和執(zhí)行這個同樣的查詢。
注意:查詢緩存絕不返回過期數(shù)據(jù)。當(dāng)數(shù)據(jù)被修改后,在查詢緩存中的任何相關(guān)詞條均被轉(zhuǎn)儲清除。
在某些表并不經(jīng)常更改,而你又對它執(zhí)行大量的相同查詢時,查詢緩存將是非常有用的。對于許多 web 服務(wù)器使用大量的動態(tài)信息,這是一個很典型的情況。
下面是查詢緩存的一個性能數(shù)據(jù)。(這些結(jié)果的產(chǎn)生,是通過在一個 a Linux Alpha 2 x 500 MHz、2GB RAM 和 64MB 查詢緩存上執(zhí)行 MySQL 基準(zhǔn)套件和到的):
如果你執(zhí)行的所有查詢均是簡單的(比如從表中一行一行的選取);但是仍然是不同的,所以該查詢不能被緩沖,查詢緩存處于活動時,開銷為 13%。這可以被看作是最差的情況。然而,在實際情況下,查詢是比我們的簡單示例要復(fù)雜得多的,所以開銷通常顯著得低。
在只有一行記錄表中搜索一行后,搜索將快 238% 。這可以被認(rèn)為是接近于對一個被緩沖的查詢所期望的最小的加速。
如果你希望禁用查詢緩存,設(shè)置 query_cache_size=0
。禁用了查詢緩存,將沒有明顯的開銷。(在配置選項 --without-query-cache
的幫助下,查詢緩存可以被排除在外碼之外)
查詢在分析之前先被比較,因而
SELECT * FROM tbl_name
和
Select * from tbl_name
對于查詢緩存被當(dāng)作是不同的查詢,因而查詢需要嚴(yán)格的一致(字節(jié)對字節(jié)的),才會被認(rèn)為是同樣的。 另外,如果一個客戶端使用一個新的連接協(xié)議格式或不同于其它客戶端的另一個字符集,一個查詢將被視為不同的。
使用不同數(shù)據(jù)庫的,使用不同協(xié)議版本的,或使用不同的缺省字符串的查詢將被認(rèn)為是不同的查詢,并將分別的緩沖。
高速緩沖不對 SELECT CALC_ROWS ...
和 SELECT FOUND_ROWS() ...
類型的查詢起作用,因為找到的行的數(shù)目也是被存儲在緩沖里的。
如果查詢結(jié)果被從查詢緩存中返回,那么狀態(tài)變量 Com_select
將不會被增加,但是 Qcache_hits
卻會增加。查看章節(jié) 6.9.4 查詢緩存的狀態(tài)和維護(hù)。
如果一個表發(fā)生的改變 (INSERT
, UPDATE
, DELETE
, TRUNCATE
, ALTER
或 DROP TABLE|DATABASE
),那么所有這張表使用的緩沖的查詢(可能通過一個 MRG_MyISAM
表!)將被得失效,并從緩沖中移除。
Innodb
表的事務(wù)所做的更改將在一個 COMMIT
被完成時,使數(shù)據(jù)失效。
如果一個查詢包括下面的函數(shù),它將不能被緩沖: 函數(shù) 函數(shù) 函數(shù) 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
(只有一個參數(shù)調(diào)用) LAST_INSERT_ID
RAND
unix_TIMESTAMP
(無參數(shù)調(diào)用) USER
BENCHMARK
如果一個查詢包含用戶變量,引用 MySQL 系統(tǒng)數(shù)據(jù)庫,或下列之一的格式,SELECT ... IN SHARE MODE
, SELECT ... INTO OUTFILE ...
, SELECT ... INTO DUMPFILE ...
或 SELECT * FROM AUTOINCREMENT_FIELD IS NULL
(檢索最后一個插入 ID - ODBC 語句),該查詢亦不可以被緩存。
然而,FOUND ROWS()
將返回正確的值,即使先前的查詢是從緩存中讀取的。
萬一一個查詢不使用任何表,或使用臨時表,或用戶對任何相關(guān)表有一個列權(quán)限,那么查詢將不會被緩存。
在一個查詢從查詢緩存中讀取前,MySQL 將檢查用戶對所有相關(guān)的數(shù)據(jù)庫和表有 SELECT 權(quán)限。如果不是這種情況,緩存的結(jié)果將不能被使用。
查詢緩存為了 mysqld
添加了幾個 MySQL
系統(tǒng)變量,它可以在配置文件中被設(shè)置,或在啟動 mysqld
時的命令行上設(shè)置。
query_cache_limit
不緩存大于這個值的結(jié)果。(缺省為 1M)
query_cache_min_res_unit
這個變量從 4.1 被引進(jìn)。 查詢的結(jié)果 (已被傳送到客戶端的數(shù)據(jù)) 在結(jié)果檢索期間被存儲到查詢緩存中。因而,數(shù)據(jù)不會以一個大塊地處理。查詢緩存在需要時分配塊用于處理這個數(shù)據(jù),所以當(dāng)一個塊被填充后,一個新的塊被分配。甚為內(nèi)存分配操作是昂貴的,查詢緩存以最小的尺寸 query_cache_min_res_unit
分配塊。當(dāng)一個查詢執(zhí)行完成,最后的結(jié)果塊被修整到實際數(shù)據(jù)的尺寸大小,以便未使用的內(nèi)存被釋放。
query_cache_min_res_unit
的缺省值為 4 KB,在大多數(shù)據(jù)情況下已夠用了。
如果你有許多查詢返回一個較小的結(jié)果,缺省的塊尺寸可能會引起內(nèi)存碎片 (顯示為一個很大數(shù)量的空閑塊(Qcache_free_blocks
),這將引起查詢緩存不得不因缺乏內(nèi)存(Qcache_lowmem_prunes
)而從緩存中刪除查詢)。在這種情況下,你應(yīng)該減少 query_cache_min_res_unit
。
如果你的主要查詢返回的是大的結(jié)果集(查看 Qcache_total_blocks
和 Qcache_queries_in_cache
),你可以通過增加 query_cache_min_res_unit
來增加性能。然而,要小心不要將它設(shè)得太大。
query_cache_size
為了存儲老的查詢結(jié)果而分配的內(nèi)存數(shù)量 (以字節(jié)指定) 。如果設(shè)置它為 0 ,查詢緩沖將被禁止(缺省值為 0 )。
query_cache_type
這個可以被設(shè)置為 (只能是數(shù)字) 選項 含義 0 (OFF, 不緩存或重新得到結(jié)果) 1 (ON, 緩存所有的結(jié)果,除了 SELECT SQL_NO_CACHE ...
查詢) 2 (DEMAND, 僅緩存 SELECT SQL_CACHE ...
查詢)
在一個線程(連接)內(nèi),查詢緩存的行為可以被改變。句法如下所示:
QUERY_CACHE_TYPE = OFF | ON | DEMAND
QUERY_CACHE_TYPE = 0 | 1 | 2
選項 含義 0 or OFF 不緩存或重新得到結(jié)果 1 or ON 緩存所有的結(jié)果,除了 SELECT SQL_NO_CACHE ...
查詢 2 or DEMAND 僅緩存 SELECT SQL_CACHE ...
查詢
SELECT
中的查詢緩存選項有兩個可能的查詢緩存相關(guān)的參數(shù)可以在一個 SELECT
查詢中被指定:
選項 含義 SQL_CACHE
如果 QUERY_CACHE_TYPE
為 DEMAND
,允許該查詢被緩存。如果 QUERY_CACHE_TYPE
為 ON
,這是缺省的。如果 QUERY_CACHE_TYPE
為 OFF
,它不做任何事 SQL_NO_CACHE
使這個查詢不被緩存,不允許這個查詢被存儲到高速緩存中
使用 FLUSH QUERY CACHE
命令,你可以整理查詢緩存,以更好的利用它的內(nèi)存。這個命令不會從緩存中移除任何查詢。FLUSH TABLES
會轉(zhuǎn)儲清除查詢緩存。
RESET QUERY CACHE
使命從查詢緩存中移除所有的查詢結(jié)果。
你可以檢查查詢緩存在你的 MySQL 是否被引進(jìn):
mysql> SHOW VARIABLES LIKE 'have_query_cache'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | have_query_cache | YES | +------------------+-------+ 1 row in set (0.00 sec)
在 SHOW STATUS
中,你可以監(jiān)視查詢緩存的性能:
變量 含義 Qcache_queries_in_cache
在緩存中已注冊的查詢數(shù)目 Qcache_inserts
被加入到緩存中的查詢數(shù)目 Qcache_hits
緩存采樣數(shù)數(shù)目 Qcache_lowmem_prunes
因為缺少內(nèi)存而被從緩存中刪除的查詢數(shù)目 Qcache_not_cached
沒有被緩存的查詢數(shù)目 (不能被緩存的,或由于 QUERY_CACHE_TYPE
) Qcache_free_memory
查詢緩存的空閑內(nèi)存總數(shù) Qcache_free_blocks
查詢緩存中的空閑內(nèi)存塊的數(shù)目 Qcache_total_blocks
查詢緩存中的塊的總數(shù)目
Total number of queries = Qcache_inserts
+ Qcache_hits
+ Qcache_not_cached
.
查詢緩存使用變長的塊,因而 Qcache_total_blocks
和 Qcache_free_blocks
可能顯示查詢緩存的碎片。在 FLUSH QUERY CACHE
之后,只有剩余一個單獨的(大的)空閑塊。
注意:每個查詢最小需要兩個塊(一個用于存儲查詢文本,另一個或多個用于存儲查詢結(jié)果)。同樣的,每個被一個查詢使用的表需要一個塊,但是,如果有兩個或更多的查詢使用同一張表,僅僅只需要分配一個塊就行了。
你可以使用狀態(tài)變量 Qcache_lowmem_prunes
來諧調(diào)查詢緩存尺寸。它計數(shù)被從緩存中移除的查詢,該查詢的移除是為了釋放內(nèi)存,以緩存新建的查詢。查詢緩存使用一個 least recently used
(LRU
) 策略來判斷從緩存中移除哪個查詢。
以上是“MySQL怎樣查詢緩存”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。