相关动态
MySQL核心技术原理之:查询缓存与结果缓存
2024-11-10 18:25

作者:禅与计算机程序设计艺术

MySQL核心技术原理之:查询缓存与结果缓存

随着互联网的蓬勃发展,网站流量越来越大,网站的数据库访问频率也越来越高,而对于数据库服务器来说,一次数据库请求所花费的时间也越来越长。为了解决这个问题,数据库系统设计者们提出了缓存技术,将数据库中的数据存储到内存中,这样就可以减少数据库的访问次数,加快响应速度。

查询缓存(Query Cache)是指当用户执行一条SQL语句时,首先在缓存中查找该条SQL是否已经被缓存过,如果已经被缓存,则直接从缓存中返回查询结果;否则,才会真正去数据库中进行查询。缓存的存在可以极大的提高数据库查询效率。因为相比于每次都需要去数据库中查询,缓存后只需从内存中获取结果,查询速度就会显著地提升。由于缓存通常是内存空间,因此查询缓存不能无限扩大,所以缓存过期、容量限制等方面都需要进行设置。

结果缓存(Result Cache)是指当用户执行一条SELECT语句(即查询语句)时,在查询结束之前,先把结果存放在内存中,直到下次再需要的时候再取出结果并返回给客户端。而非查询语句,例如INSERT、UPDATE、DELETE语句,一般不会执行结果缓存,也就是说即使对同一个表进行操作多次,其结果也不会被缓存起来。

缓存击穿(cache-miss)是指某个热点数据被访问的情况,当某个数据出现在缓存中时,由于某种原因(如缓存过期或缓存空间不足),导致无法及时的更新到缓存中,从而导致缓存中没有该数据,然后用户再次访问该数据时,由于此时缓存中并没有该数据,因此只能从源数据库中读取。这种现象称之为缓存击穿。

缓存穿透(cache-penetration)是指在缓存和数据库中都没有对应的数据,导致用户查询不到想要的数据。缓存穿透是一种性能问题,当缓存和数据库中都没有相应的数据时,查询将会向源数据库发送请求,这种请求量可能会很大,甚至造成系统崩溃。

缓存雪崩(cache-avalanche)是指在某段时间内,缓存集体失效,所有请求都怼到数据库上。由于缓存过期时间短,刚好失效导致大量请求同时访问数据库,引起数据库压力过大,甚至宕机。

查询缓存的基本原理是将查询到的结果保存到缓存中,当下次有相同的查询请求时,就直接从缓存中返回查询结果,避免重新查询,提高查询效率。由于缓存是内存空间,不能无限扩大,因此系统设计者需要设置缓存的过期时间、大小限制等参数。

检查查询缓存

在执行SQL语句前,需要检查查询缓存中是否已经有缓存。如果缓存命中,则直接从缓存中读取查询结果;如果缓存丢失或者过期,则继续执行SQL语句并将查询结果保存到缓存中。

操作步骤

1.检查SQL文本是否与缓存中的SQL文本一致。如果一致,则表示命中缓存。 2.检查是否已经超过缓存过期时间。如果超过过期时间,则表示缓存过期,需要重新查询。 3.检查查询结果是否已经在缓存中。如果已经在缓存中,则直接从缓存中读取结果。 4.如果查询结果不存在缓存中,则执行SQL语句并将查询结果保存到缓存中。

SQL文本匹配规则

检查SQL文本匹配规则如下

1.SQL文本完全匹配。 2.SQL文本与缓存中的SQL文本包含关系。

SQL文本完全匹配

SQL文本完全匹配时,比较SQL文本完全相同,才认为命中缓存。

SQL文本包含关系

SQL文本包含关系时,比较SQL文本是否包含缓存中的SQL文本。例如

 

该SQL语句中包含,因此可以命中以下缓存

 

缓存中包含字段,但是该缓存不是针对上述SQL语句的,因此并不命中。

清空查询缓存

当修改数据库中的数据时,如果已经命中的缓存失效,则需要清除掉该缓存,以保证数据的最新性。

操作步骤

1.删除对应的缓存项。 2.刷新缓存中的最近使用列表。 3.如果缓存已满,则清除最近最久未使用的数据。

删除对应的缓存项

当修改数据库的数据时,要删除对应的缓存项。具体做法是,首先根据SQL语句生成唯一的key值,然后删除对应的缓存项即可。

刷新缓存中的最近使用列表

缓存中的数据有两种类型:热点数据(经常访问的数据)和冷数据(不经常访问的数据)。维护最近使用的列表,能够快速淘汰缓存中不需要的数据,以节约内存。

刷新最近使用列表的方式有两种

1.定期扫描缓存,检查哪些数据最近被访问,并将其移到列表头部。 2.当有新数据加入缓存时,自动添加到列表尾部。

如果缓存已满

当缓存满了之后,需要清除掉最近最久未使用的数据,以腾出缓存空间。具体做法是,首先按最近最久未使用排序,清除最后的一部分数据;也可以选择优先级低的缓存项,将其淘汰掉。

结果缓存的基本原理是将查询结果保存到内存中,当下次需要该结果时,就直接从缓存中返回结果,而不是重新执行查询,提高查询效率。

设置结果缓存

设置结果缓存一般通过启动参数完成,比如mysqld --query_cache_type=ON 或 my.ini 中的 query_cache_type 参数。

查找查询缓存

在执行查询语句前,首先检查查询缓存中是否已经有缓存。如果查询缓存已经存在,则直接从缓存中返回查询结果;如果查询缓存不存在,则继续执行查询语句并将查询结果保存到缓存中。

操作步骤

1.检查SQL文本是否与缓存中的SQL文本一致。如果一致,则表示命中缓存。 2.检查缓存中是否已经有查询结果。如果有,则直接返回结果。 3.如果缓存中没有查询结果,则执行SQL语句并将查询结果保存到缓存中。

SQL文本匹配规则

检查SQL文本匹配规则如下

1.SQL文本完全匹配。 2.SQL文本与缓存中的SQL文本包含关系。

SQL文本完全匹配

SQL文本完全匹配时,比较SQL文本完全相同,才认为命中缓存。

SQL文本包含关系

SQL文本包含关系时,比较SQL文本是否包含缓存中的SQL文本。例如

 

该SQL语句中包含,因此可以命中以下缓存

 

缓存中包含字段,但是该缓存不是针对上述SQL语句的,因此并不命中。

查询缓存案例模拟一个数据库系统,其中有两个表和。为了演示查询缓存的效果,假设设置了查询缓存和热点数据缓存。

 

查询缓存案例分析

为了验证查询缓存的效果,我们进行一下操作

 

查询缓存案例总结

从上面的例子可以看出,在第二次查询时,查询结果已经被缓存,不会再去执行查询。而且在执行更新操作时,更新的是缓存中的数据,而不是直接去数据库中更新。缓存失效时,要将更新的数据写入缓存,因此效率更高。

结果缓存案例模拟一个微博系统,每隔十分钟更新一次话题排行榜。为了验证结果缓存的效果,我们进行一下操作

 

从以上查询结果可以看出,开启结果缓存后的查询速度较前者提升明显。原因在于结果缓存能够命中缓存中保存的结果,避免了重复计算,加快查询速度。

目前,MySQL查询缓存主要用于缓存查询语句的结果,以提高查询效率。如果想进一步提高查询缓存的应用范围,比如缓存整个表的查询结果,那么就会遇到热点数据的缓存问题。

热点数据的缓存问题是指某一段时间内,缓存命中率很高,缓存占用内存很多的问题。这种问题往往发生在有大量热点数据的环境下,比如电商网站日均订单量最大的几个小时、秒杀活动、秒杀商品购买人数最多的那段时间等。由于缓存命中率高,所以缓存占用内存很多,最终影响到了其他查询请求的响应时间。

解决热点数据的缓存问题,可以从以下几个方面着手

1.利用Redis等分布式缓存技术。目前很多开源分布式缓存产品,都提供了热点数据缓存功能,可以在这些产品上部署缓存解决方案,降低热点数据的缓存命中率。

2.对于热点数据,采用异步方式处理。对于访问较少的热点数据,可以采用异步的方式处理,将访问操作放入队列中,由后台线程去处理。而对于访问较多的热点数据,可以使用同步的方式处理,确保缓存命中率。

3.缓存数据的有效期。对热点数据设置较短的缓存有效期,使得缓存命中率降低,但不会影响缓存的整体性能。另外,对于一些实时性要求不高的业务,可以适当延长缓存有效期,以达到最优的效果。

随着互联网业务的发展,数据库也在增长。单一的数据库的存储能力已经无法满足需求。比如微信朋友圈的消息记录、手机通讯录、地图导航信息等。

为了解决这个问题,许多公司和组织开始采用分片方案,将数据划分为多个独立的数据库实例,每个实例负责管理其中一部分数据,彻底解决单库存储容量问题。然而,单个分片可能也会面临热点数据缓存的问题,甚至会成为系统性能瓶颈。

如何解决分片缓存问题?有以下几种方案

1.数据分区。将数据按照某种规则分散到不同的分片中,每个分片的存储能力不同,从而缓解单个分片存储容量过小的问题。另外,可以基于数据特征对分片进行拆分,降低热点数据的影响。

2.异地多活架构。为了避免主备同步延迟带来的性能问题,可以将热点数据同步到多个可用区或区域,以提升系统的访问性能。

3.数据缓存分层。除了使用本地缓存,还可以通过多级缓存方案,将热点数据缓存在各级缓存中,提升系统的访问性能。第一级缓存可以部署在本地,第二级缓存部署在离用户最近的地方,第三级缓存部署在远处。第三级缓存需要依赖于云厂商的服务,比如亚马逊的CloudFront。

1.什么是MySQL查询缓存?

查询缓存是MySQL数据库系统提供的一种优化策略,能够对频繁执行的SELECT语句的结果进行缓存。通过缓存,下一次相同的SELECT语句的执行过程可直接从缓存中获取结果,避免重新计算,提高数据库查询效率。

2.为什么MySQL查询缓存能够提高查询效率?

查询缓存主要用于缓存查询语句的结果,避免重复计算,提高数据库查询效率。由于缓存命中率高,所以缓存占用内存很多,最终影响到了其他查询请求的响应时间。

3.MySQL查询缓存工作原理是什么样的

MySQL查询缓存的工作原理是,当查询请求到来时,首先在缓存中查找该条SQL是否已经被缓存过,如果已经被缓存,则直接从缓存中返回查询结果;否则,才会真正去数据库中进行查询。缓存的存在可以极大的提高数据库查询效率。

4.查询缓存对什么类型的SQL语句生效

查询缓存仅对SELECT类型的SQL语句有效。

5.查询缓存中SQL文本的匹配规则是什么

查询缓存中SQL文本的匹配规则分两类:完全匹配和包含匹配。包含匹配就是将查询语句中的一些关键字包含在缓存的SQL文本中,且顺序相同。完全匹配就是查询语句与缓存的SQL文本完全相同。

6.MySQL查询缓存存在什么问题

MySQL查询缓存存在以下问题

1.缓存击穿:缓存击穿是指某个热点数据被访问的情况,当某个数据出现在缓存中时,由于某种原因(如缓存过期或缓存空间不足),导致无法及时的更新到缓存中,从而导致缓存中没有该数据,然后用户再次访问该数据时,由于此时缓存中并没有该数据,因此只能从源数据库中读取。这种现象称之为缓存击穿。

2.缓存穿透:缓存穿透(cache-penetration)是指在缓存和数据库中都没有对应的数据,导致用户查询不到想要的数据。缓存穿透是一种性能问题,当缓存和数据库中都没有相应的数据时,查询将会向源数据库发送请求,这种请求量可能会很大,甚至造成系统崩溃。

3.缓存雪崩:缓存雪崩(cache-avalanche)是指在某段时间内,缓存集体失效,所有请求都怼到数据库上。由于缓存过期时间短,刚好失效导致大量请求同时访问数据库,引起数据库压力过大,甚至宕机。

7.怎么设置MySQL查询缓存的过期时间

可以使用查询语句

    以上就是本篇文章【MySQL核心技术原理之:查询缓存与结果缓存】的全部内容了,欢迎阅览 ! 文章地址:http://yejunbin01.xhstdz.com/quote/64476.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://yejunbin01.xhstdz.com/mobile/ , 查看更多   
发表评论
0评