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 查询缓存中的块的总数目