网站地图    收藏   

主页 > 后端 > php资料库 >

MySQL缓存设置操作实例教程_自学php网

来源:自学PHP网    时间:2014-12-04 22:12 作者: 阅读:

[导读] MySQL中默认开启缓存机制, 缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。 PS:缓存的sql是区分大小写的, 下面sql查询缓存认...

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论