如果一个表发生的改变 (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
语句),该查询亦不可以被缓存。
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.