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

导读:本篇文章讲解 RocketMQ与innoDB使用页缓存(PageCache)提升查询效率,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

什么是页缓存(PageCache)?

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

RocketMQ为什么使用pagecache?

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

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

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

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. 所有的数据项,都是按照大小顺序存放在同一层的叶子节点中,各叶子节点间用指针连接。

示例如图:

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13599.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!