MySQL 4.1.0 中文參考手冊 --- 6.9 MySQL 查詢快取 (轉)
MySQL Reference Manual for version 4.1.0-alpha.
6.9 MySQL 查詢快取
從 MySQL 4.0.1 開始,My
有一個重要的特徵:Query Cache
。 當在使用中,查詢快取會一個 查詢的文字與被傳送到客戶端的相應結果。如果之後接收到一個同樣的查詢,將從查詢快取中檢索結果,而不是再次分析和這個同樣的查詢。
注意:查詢快取絕不返回過期資料。當資料被修改後,在查詢快取中的任何相關詞條均被轉儲清除。
在某些表並不經常更改,而你又對它執行大量的相同查詢時,查詢快取將是非常有用的。對於許多 伺服器使用大量的動態資訊,這是一個很典型的情況。
下面是查詢快取的一個資料。(這些結果的產生,是透過在一個 a 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
卻會增加。檢視章節 。
如果一個表發生的改變 (INSERT
, UPDATE
, DELETE
, TRUNCATE
, ALTER
或 DROP TABLE|DATABASE
),那麼所有這張表使用的緩衝的查詢(可能透過一個 MRG_MyISAM
表!)將被得失效,並從緩衝中移除。
Inno
表的事務所做的更改將在一個 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
_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
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
) 策略來判斷從快取中移除哪個查詢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-998564/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MySQL 5.7參考手冊】8.14.2 General Thread StatesMySqlthread
- DOJO API 中文參考手冊API
- mysql查詢快取簡單使用MySql快取
- MySQL8-中文參考-三-MySql
- MySQL8-中文參考-三十二-MySql
- 譯-MYSQL5.7參考手冊--數值型別概述MySql型別
- 譯-MYSQL5.7參考手冊--11.1.1數值型別概述MySql型別
- MySQL查詢擷取分析MySql
- MySQL的查詢快取功能何時該開啟MySql快取
- [玩轉MySQL之四]MySQL快取機制MySql快取
- JavaScript物件參考手冊JavaScript物件
- Mysql 插入中文及中文查詢 (修改+除錯)MySql除錯
- 降級MySQL(參考MySQL官方文件)MySql
- 帶你玩玩轉 MySQL 查詢MySql
- [玩轉MySQL之六]MySQL查詢優化器MySql優化
- MySQL查詢取別名報錯MySql
- python查詢mysql中文亂碼問題PythonMySql
- 譯-MYSQL5.7參考手冊--11.1.2日期與時間型別概述MySql型別
- MySQL字串轉時間戳查詢MySql字串時間戳
- mysql許可權參考MySql
- docker 安裝 MySQL (參考)DockerMySql
- MySQL查詢MySql
- Python sys模組參考手冊Python
- Python os模組參考手冊Python
- 20200116 - HTML 和 CSS 參考手冊HTMLCSS
- PHP-imap 使用參考手冊PHP
- MySQL & MariaDB Online DDL 參考指南MySql
- RedHat Advance Server上安裝Oracle 9204 RAC參考手冊(轉)RedhatServerOracle
- Mysql5.1中文手冊 CHM下載MySql
- mysql查詢模型MySql模型
- MYsql 子查詢MySql
- 【MySQL】多表查詢MySql
- mysql多表查詢MySql
- MySQL子查詢MySql
- MySQL慢查詢MySql
- MySQL 多表查詢MySql
- mysql 模糊查詢MySql
- MySQL 慢查詢MySql
- Mysql 獲取表設計查詢語句MySql