Mysql缓存研究

标签: mysql 缓存 研究 | 发表时间:2012-09-20 18:43 | 作者:gzh0222
出处:http://blog.csdn.net


缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存值的相关条目被清空。更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同sql查询的表,查询缓存会节约很大的性能。

MySQL 检查缓存命中的规则

1、在检查缓存的时候,MySQL 不会对语句进行解析、正则化或者参数化,它精确地使用客户端传来的查询语句和其他数据。只要字符大小写、空格或者注释有一点点不同,查询缓存就认为这是一个不同的查询

2、查询缓存不会存储有不确定结果的查询。因此,任何一个包含不确定函数(比如NOW()或CURRENT_DATE())的查询不会被缓存。同样地,CURRENT_USER()或CONNECTION_ID()这些由不同用户执行,将会产生不同的结果的查询也不会被缓存。事实上,查询缓存不会缓存引用了用户自定义函数、存储函数、用户自定义变量、临时表、mysql 数据库中的表或者任何一个有列级权限的表的查询

3、查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。

开启查询缓存的开销

  读取查询在开始之前必须要检查缓存。

  如果查询是可以被缓存的,但是不在缓存中,那么在产生结果之后进行保存会带来一些额外的开销。写入数据的查询也会有额外的开销,因为它必须使缓存中相关的数据表失效。

这些开销相对来说较小,所以查询缓存还是很有好处的。但是,稍后你会看到,额外的开销有可能也会增加。从缓存中受益最多的查询可能是需要很多资源来产生结果,但是不需要很多空间来保存的类型。所以用于存储、返回和失效的代价都较小。聚集查询,比如从大表中利用COUNT()产生较小的结果,就符合这个范畴。

分析和调整查询缓存的一个图示(网上找到的)

 

Msyql缓存状态的查看


have_query_cache 的值如果是yes表示开启缓存

Binlog_cache_size:默认大小是32768即32K

Max_binlog_cache_size: 默认值是18446744073709547520,这个值很大,够我们使用的了。此参数和binlog_cache_size相对应,代表binlog所能使用的cache最大使用大小。如果系统中事务过多,而此参数值设置有小,则会报错。

query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache

query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小

query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数

query_cache_type:控制 Query Cache 功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下:

0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache

1(ON):开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache

2(DEMAND):开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache

query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有 Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。

检查查询缓存使用情况

此时的查询缓存命中率:175/(175+4)=97%;由于个人的测试数据库,查询较少,更行更少,命中率颇高。嘿嘿~~

MySQL 提供了一系列的 Global Status来记录 Query Cache的当前状态,具体如下:

Qcache_free_blocks:目前还处于空闲状态的 Query Cache中内存 Block 数目

Qcache_free_memory:目前还处于空闲状态的 Query Cache内存总量

Qcache_hits:Query Cache命中次数

Qcache_inserts:向 Query Cache中插入新的Query Cache的次数,也就是没有命中的次数

Qcache_lowmem_prunes:当 Query Cache内存容量不够,需要从中删除老的Query Cache以给新的 Cache 对象使用的次数

Qcache_not_cached:没有被 Cache的SQL 数,包括无法被 Cache 的 SQL 以及由于query_cache_type设置的不会被Cache的 SQL

Qcache_queries_in_cache:目前在 Query Cache中的SQL 数量

Qcache_total_blocks:Query Cache中总的Block 数量

清空缓存


之前的Qcache_hits  Qcache_inserts均被清空

作者:gzh0222 发表于2012-9-20 18:44:21 原文链接
阅读:3 评论:0 查看评论

相关 [mysql 缓存 研究] 推荐:

Mysql缓存研究

- - CSDN博客推荐文章
缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql. 如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存值的相关条目被清空. 更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询.

优化MySQL,还是使用缓存?

- - BlogJava-qileilove
今天我想对一个Greenfield项目上可以采用的各种性能优化策略作个对比. 换言之,该项目没有之前决策强加给它的各种约束限制,也还没有被优化过.   具体来说,我想比较的两种优化策略是优化. 提前指出,这些优化是正交的,唯一让你选择其中一者而不是另一者的原因是他们都耗费了资源,即开发时间.   优化MySQL时,一般会先查看发送给mysql的查询语句,然后运行explain命令.

MySQL 数据库性能优化之缓存参数优化

- flychen50 - Sky.Jian 朝阳的天空
在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助. 这是 MySQL数据库性能优化专题 系列的第一篇文章:MySQL 数据库性能优化之缓存参数优化.

mysql状态查看 QPS/TPS/缓存命中率查看

- - 数据库 - ITeye博客
运行中的mysql状态查看. 对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态. (1)QPS(每秒Query量). (2)TPS(每秒事务量). (3)key Buffer 命中率. (4)InnoDB Buffer命中率. (5)Query Cache命中率. (6)Table Cache状态量.

redis作为mysql的缓存服务器(读写分离)

- - 数据库 - ITeye博客
Redis是一个key-value存储系统. 和Memcached类似,为了保证效率,数据都是缓存在内存中. 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步. 在部分场合可以对关系数据库起到很好的补充作用. 它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便.

MySQL 高可用架构在业务层面的分析研究

- - CSDN博客数据库推荐文章
相对于传统行业的相对服务时间9x9x6或者9x12x5,因为互联网电子商务以及互联网游戏的实时性,所以服务要求7*24小时,业务架构不管是应用还是数据库,都需要容灾互备,在mysql的体系中,最好通过在最开始阶段的数据库架构阶段来实现容灾系统. 所以这里从业务宏观角度阐述下mysql 架构的方方面面.

mysql查询缓存打开、设置、参数查询、性能变量意思

- - 数据库 - ITeye博客
一般,我们会把 query_cache_type 设置为 ON,默认情况下应该是ON. 这样 当我们执行 select id,name from tableName; 这样就会用到查询缓存. ①在 query_cache_type 打开的情况下,如果你不想使用缓存,需要指明. 第二: 系统变量 have_query_cache 设置查询缓存是否可用.

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

MySQL Replication 线程

- - CSDN博客推荐文章
Replication 线程. Mysql 的Replication 是一个异步的复制过程,从一个Mysql instace(我们称之为Master)复制到另一个Mysql instance(我们称之Slave). 在Master 与Slave 之间的实现整个复制过程主. 要由三个线程来完成,其中两个线程(Sql 线程和IO 线程)在Slave 端,另外一个线程(IO 线程)在Master 端.

mysql backup 脚本

- - ITeye博客
网上备份脚本很多,但考虑都不周全. 保证创建备份文件只能是创建者跟root可以访问,其他用户没有权限,保证了数据库备份的安全. 上面脚本是负责备份的份数管理,. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.