MySQL中默认开启缓存机制,缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。
PS:缓存的sql是区分大小写的,下面sql查询缓存认为是不同的:SELECT * FROM tbl_name,select * from tbl_name;因而查询需要严格的一致(字节对字节的),才会被认为是同样的。所以团队开发的时候要注意sql写法规范,这样才能充分利用sql的缓存。还有sql中如果含有动态的内容,比如CURRENT_DATE()这类函数以及用户自定义的参数等,结果也是不会被缓存的。
查询缓存设置
查询缓存为了 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
选项 含义
0 or OFF 不缓存或重新得到结果
1 or ON 缓存所有的结果,除了 SELECT SQL_NO_CACHE … 查询
2 or DEMAND 仅缓存 SELECT SQL_CACHE … 查询
缓存的管理:
使用 FLUSH QUERY CACHE 命令,你可以整理查询缓存,以更好的利用它的内存。这个命令不会从缓存中移除任何查询。FLUSH TABLES 会转储清除查询缓存。RESET QUERY CACHE 使命从查询缓存中移除所有的查询结果。
还有一点,开启缓存是有额外代价的,如果要检查查询是否从缓存受益,可以计算查询缓存命中率,公式:
Qcache_hits / (Qcache_hits+Com_select);这两个状态可以使用show status like '%...%'查询。一般30%的命中
率也会很有帮助。
下面操作实例:
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 | 599040 | --查询缓存的大小
| query_cache_type | ON | --阻止或是支持查询缓存
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
mysql> set global query_cache_size = 600000; --设置缓存内存
Query OK, 0 rows affected (0.00 sec)
mysql> set session query_cache_type = ON; --开启查询缓存
mysql> flush status;--清除状态
mysql> SHOW STATUS LIKE '%Qcache%';--查看缓存性能
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.16 sec)
变量 含义
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 查询缓存中的块的总数目 |