您的位置:首页 > 数据库 > MySQL

【小镇的技术天梯】MySQL 查询缓存

2016-02-27 12:14 423 查看
【如果你想真正的提升mysql的效率,除了在代码层面,还需要在硬件方面得以提升,现在web应用的性能瓶颈基本上都在数据库的io性能方面,如果能够给服务器加装ssd硬盘的话,那么提升的将不是一个等级的速度!】

Mysql存在着查询缓存机制,大家要明白,计算机有着硬件存储金字塔,cpu的速度远远大于硬盘的速度,为了让整体的性能不下降,中间加入了很多的缓存硬件,从L1,L2,L3缓存到内存再到硬盘再到远程存储,这一切都是为了提升整体的效率,同样我们的软件也需要考虑到这些问题,有些经常读取并且不经常改变的的数据我们就应该让其命中更高等级的缓存结构,在这里我们的数据缓存当然是内存。

MySQL查询缓存可以跳过SQL解析优化查询等阶段,直接返回缓存结果给用户,查询缓存的工作流程如下:

命中条件

缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key.在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,SQL任何字符上的不同,如空格,注释,都会导致缓存不命中.

如果查询中有不确定数据,例如CURRENT_DATE()和NOW()函数,那么查询完毕后则不会被缓存.所以,包含不确定数据的查询是肯定不会找到可用缓存的

工作流程

1. 服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)

2. 如果找到了缓存,则直接返回缓存(性能提升)

3. 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.

4. 执行完SQL查询结果以后,将SQL查询结果存入缓存表(额外性能消耗)

缓存失效

当某个表正在写入数据,则这个表的缓存(命中检查,缓存写入等)将会处于失效状态.在Innodb中,如果某个事务修改了表,则这个表的缓存在事务提交前都会处于失效状态,在这个事务提交前,这个表的相关查询都无法被缓存.

缓存的内存管理

缓存会在内存中开辟一块内存(query_cache_size)来维护缓存数据,其中有大概40K的空间是用来维护缓存的元数据的,例如空间内存,数据表和查询结果的映射,SQL和查询结果的映射等.

MySQL将这个大内存块分为小的内存块(query_cache_min_res_unit),每个小块中存储自身的类型,大小和查询结果数据,还有指向前后内存块的指针.

缓存的使用时机

衡量打开缓存是否对系统有性能提升是一个很难的话题

1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)

2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)

3. 通过 命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: