MySQL查询缓存功能对一条SQL查询语句第一次执行时,会将其结果缓存起来。以后执行同一条语查询句时(SQL字符串必须完全相同),可以跳过SQL解析优化查询等阶段,直接返回缓存结果给用户。
如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, 或DROP DATABASE等操作时,之前的缓存会失效并且删除。这也在一定程度上会影响我们数据库的性能,所以对一些频繁的变动表的情况开启缓存是不明智的。
通常安装时默认是开启查询缓存功能的。
1. 查看当前MySQL服务器是否包含查询缓存功能
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
2. 查看查询缓存开启情况
mysql> show variables like '%query_cache%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 20971520 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
/*
query_cache_type:
OFF(0): 关闭查询缓存。
ON(1): 除了带SELECT SQL_NO_CACHE ... 参数的查询语句都使用查询缓存。
DEMAND(2): 只有带SELECT SQL_CACHE ... 参数的查询语句才使用查询缓存。
*/
3. 开启查询缓存
/* 方法1:临时设置 */
mysql> SET GLOBAL query_cache_size = 20971520;
mysql> SET SESSION query_cache_type = DEMAND;
/*
query_cache_size: 设置缓存空间大小(字节)
*/
/* 方法2: 永久设置(MySQL配置文件)
my.cnf 或 my.ini
*/
[mysqld]
query_cache_type = DEMAND
query_cache_size = 10M
4. 查看查询缓存命中及运行情况
mysql>SELECT count(*) FROM sta_log;
+ ------------- +
| count(*) |
+ ------------- +
| 13471944 |
+ ------------- +
Query OK, 1 rows affected (6.896 sec)
...
...
...
mysql>SELECT count(*) FROM sta_log;
+ ------------- +
| count(*) |
+ ------------- +
| 13471944 |
+ ------------- +
Query OK, 1 rows affected (0.00 sec)
/* 命中缓存时,会发现查询速度明显加快 */
mysql>SHOW STATUS LIKE 'Qcache%';
+ ------------------ + ---------- +
| Variable_name | Value |
+ ------------------ + ---------- +
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 20954056 |
| Qcache_hits | 12 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 14 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+ ------------------ + ---------- +
8 rows
/*
Qcache_hits:查询缓存累计命中次数
*/