RocketMQ与innoDB使用页缓存(PageCache)提升查询效率

什么是页缓存(PageCache)?

页缓存(PageCache)是OS对文件的缓存,用于加速对文件的读写。一般来说,程序对文件进行顺序读写的速度几乎接近于内存的读写速度,主要原因就是由于OS使用PageCache机制对读写访问操作进行了性能优化,将一部分的内存用作PageCache。对于数据的写入,OS会先写入至Cache内,随后通过异步的方式由pdflush内核线程将Cache内的数据刷盘至物理磁盘上。对于数据的读取,如果一次读取文件时出现未命中PageCache的情况,OS从物理磁盘上访问读取文件的同时,会顺序对其他相邻块的数据文件进行预读取。

RocketMQ为什么使用pagecache?

一、数据和索引分离的存储结构

RocketMQ采用了数据和索引相分离的存储结构,日志数据文件CommitLog存储数据,消费队列ConsumeQueue存储索引。Broker单个实例下所有的队列共用一个日志数据文件CommitLog来存储。如图:

CommitLog日志文件

消息主体以及元数据(消息长度,消息地址,topic等信息)顺序的存储在CommitLog文件。

ConsumeQueue消费队列

ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值,单个元素是定长的。consumequeue文件可以看成是基于topic的commitlog索引文件。

二、预读取ConsumeQueue提升读取效率

在RocketMQ中,ConsumeQueue逻辑消费队列存储的数据较少,并且是顺序读取,在page cache机制的预读取作用下,Consume Queue文件的读性能几乎接近读内存,即使在有消息堆积情况下也不会影响性能。

而对于CommitLog消息存储的日志数据文件来说,读取消息内容时候会产生较多的随机访问读取,严重影响性能。如果选择合适的系统IO调度算法,比如设置调度算法为“Deadline”(此时块存储采用SSD的话),随机读的性能也会有所提升。

innoDB如何使用pagecache?

一、innoDB采用B+树数据的存储结构

B+树的详细介绍可以参考什么是B+树?。B+树的特点如下:

  1. 所有非叶子节点,不存储数据,只存储索引数据,起到索引作用
  2. 所有的数据项,都是按照大小顺序存放在同一层的叶子节点中,各叶子节点间用指针连接。

示例如图:

 二、预读取非叶子结点提升读取效率

在innoDB查询时,对非叶子结点索引数据预读取到内存中,如果索引中读取的数据数据在缓存中可以获取则,查询效率是毫秒级的。需要读取全部的数据的话,则需要根据元素主键再次查询一遍聚簇索引,进行回表查询。

因为innoDB缓存池中页的大小为16kb,B+树的层级一般都是在三层,在把非叶子结点的索引数据全部加载到缓存池中页时,数据量大概就是1000万多条左右。所以,innoDB单表数据在千万级别查询效率依然是比较高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值