各个查询引擎是如何提高写入效率,查询效率

news2025/4/16 20:58:31

RocketMq

1. 顺序IO

如果消息生产者生产了消息,发送到broker之后,需要存储在磁盘中,如果直接存储到话,并发度会很小,因为操作磁盘会很慢,尤其是操作随机IO,因此看看能不能在写入磁盘的时候,使用顺序IO,这样在接收数据的时候就能大大提高并发量。

在RocketMq则是使用了顺序IO的写入方法,使用了CommitLog文件,该文件是在顺序写入消息,每一个消息都是具有对应的物理偏移量。

当然commitLog的消息还无法进行快速消费,因此会有一个异步IO会将commitLog的消息进行取出来然后放在对应的consumerQueue中。

2. mmap内存映射

即使存在顺序IO,还是会很慢,因此为了提高并发度,采用了mmap内存映射,mmap内存映射是操作系统直接携带过来的功能。也就是虚拟内存,在内存中开辟一块空间和物理空间进行绑定,写入到commitLog文件可以直接写入到虚拟内存中,操作系统会异步将虚拟内存空间的数据写到磁盘文件中,当然这个时机我们也能控制,这个就被称为刷盘。

  1. 同步刷盘 sync_flush
  2. 异步刷盘 async_flush
  3. 异步+缓冲区 ASYNC_FLUSH && transientStorePoolEnable=trye

这里的mmap开辟的内存空间被称为pagecache ,只有当机器断电才会消息丢失。

3. 使用java编写一个mmap内存映射

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;

/**
 * @author : x
 * @date : 2023/5/26 10:28
 * @description : java使用虚拟内存操作文件
 *
 * 1. 映射文件
 * 2. 进行写入数据
 * 3. 进行读取数据
 * 4. 对比方案
 **/
public class MmapTest {

    private final String FILE_PATH = "/Users/edy/log/c.txt";
    private MappedByteBuffer buffer = null;
    private  FileChannel channel = null;
    private  RandomAccessFile randomAccessFile = null;
    public void init() throws IOException {
        File file = new File(FILE_PATH);
        randomAccessFile = new RandomAccessFile(file, "rw");
        // 获得文件通道
        channel = randomAccessFile.getChannel();
        // 映射文件到内存中
        buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 1024 * 10);
    }

    public void read() throws IOException {
        init();
        Long start = System.currentTimeMillis();
        byte[] data = new byte[1024 * 1];
        buffer.get(data);
        System.out.println(new String(data,StandardCharsets.UTF_8));
        Long end = System.currentTimeMillis();
        System.out.println("耗时(s):"+ (end - start)  );
        channel.close();
        randomAccessFile.close();
    }

    public void mmap() throws IOException {
        try {
            init();
            Long start = System.currentTimeMillis();
            for (int i = 0; i < 100; i++) {
                buffer.put(("你好啊,我是第" + i + "\r\n").getBytes(StandardCharsets.UTF_8));
            }
            Long end = System.currentTimeMillis();
            System.out.println("耗时(s):"+ (end - start)  );
        } finally {
            buffer.force();
            channel.close();
            randomAccessFile.close();
        }

    }

    public static void main(String[] args) throws IOException {
        MmapTest mmapTest = new MmapTest();
        mmapTest.mmap();
        mmapTest.read();
    }
}

在查看源码注解时有如下说明

For most operating systems, mapping a file into memory is more expensive than reading or writing a few tens of kilobytes of data via the usual read and write methods. From the standpoint of performance it is generally only worth mapping relatively large files into memory.
也就是说应该是大文件进行内存映射,小文件开辟的性能更不适用

Mysql

1. 顺序IO

同理,mysql也存在顺序io的文件读写,如果直接将数据写入到对应磁盘空间,那么必然是随机IO,随机IO的吞吐量大大降低。

其中Redo log就是作为顺序IO进
行写入数据,然后通过异步IO同步到对应的磁盘文件中。

2. 内存映射

同样在查询数据的时候,也存在pageCache,将磁盘的文件映射到pagecache中,通过pagecache提供文件读取效率,写入效率。

那么mysql到innodb有一个buffer pool这个和pagecache的区别是什么呢?

我们知道InnoDB数据库的数据是持久化在磁盘上的,而磁盘的IO速度很慢,如果每次数据库访问都直接访问磁盘,显然严重影响数据库的性能。为了提升数据库的访问性能,InnoDB为数据库的数据增加了内存缓存区(BufferPool),避免每次访问数据库都进行磁盘IO。
也就是innoDB还在存储引擎中又新增一层缓冲区。

Kafka

1. 顺序写

在这里插入图片描述

在kafka和rocektmq的也是类似的,只不过这里叫segment文件,但是这里的segment是一个topic一个queue多个segment,同时也包括对应的索引文件。

2. 页缓存PageCache

虽然消息写入是磁盘顺序写入,没有磁盘寻道的开销,但是如果针对每条消息都执行一次磁盘写入,则也会造成大量的磁盘IO,影响性能。
由于是先将消息写入到操作系统的页缓存,而页缓存数据刷新同步sync到磁盘文件是由操作系统来控制的,即操作系统通过一个内核后台线程,每5秒检查一次是否需要将页缓存数据同步到磁盘文件,如果超过指定时间或者超过指定大小则将页缓存数据同步到磁盘。所以如果在刷新到磁盘文件之前broker机器宕机了,则会导致页缓存的数据丢失。
使用页缓存的另外一个好处是,如果重启了kafka服务端(这个服务重启,而不是机器突然宕机),页缓存中的数据还是可以继续使用的。

稀疏索引

在计算机科学中,稀疏索引(Sparse Index)是一种优化的数据结构,用于提高查找和检索大型数据集的效率。

相比于传统的密集索引(Dense Index),稀疏索引在索引记录的数量上具有很大的优势。密集索引通常需要维护所有的索引值和对应的记录位置信息,因此对于数据量较大的情况下会占用大量的内存空间和处理时间。而稀疏索引则只维护部分索引值和对应的记录位置信息,可以有效减少索引的大小和查询时需要遍历的索引条目数目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制造企业如何抓住2023经济复苏做好数字化转型

2022年&#xff0c;在地缘政治冲突、新冠疫情、供应链挑战、通胀压力等多重冲击下&#xff0c;中国经济迎难而进。2023年随着防疫政策的调整和优化&#xff0c;也将成为经济全面复苏和发展的重要一年&#xff0c;这对于制造企业来说是一个重要的机遇。 据国际数据公司IDC预测&a…

尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】尚硅谷Docker实战教程-笔…

Java | 一分钟掌握定时任务 | 9 - PowerJob分布式定时任务

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱整理编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 我们选择一套框架或者技术的时候&#xff0c;一定要知道它的特点和…

电源大师课-初阶

第一课 电源系统构成和基础原理 1-电源效率 总的Pout除以Pin 2-输出电压调整率 源调整率(输入电压变化时&#xff0c;输出稳定程度) 负载调整率(输出负载变化时&#xff0c;输出稳定度) 温度调整率(工作环境温度在极限情况下&#xff0c;输出的稳定度) 3-纹波测试(20MHz、最…

KD7742电气安规综合测试仪

一、产品简介 KD7742电气安规综合测试仪具有交/直流耐压、绝缘电阻等项目的测试分析功能&#xff0c;能显示电压、电流和电阻的波形图以及趋势图&#xff0c;以便更直观的监测分析绝缘性能和绝缘崩溃时的各项指标&#xff0c;适用于高要求的测试分析场合。 产品具有测试参数范围…

郑州信源招标采购系统 定制

概述&#xff1a; 招标采购系统是郑州信源运用“互联网”、大数据、人工智能、区块链、物联网等新兴技术&#xff0c;结合供应链管理理念&#xff0c;以招标采购为核心&#xff0c;提供交易、管理、数据、服务、监管为一体的高标准采购管理平台&#xff0c;招标采购系统根据客户…

基于html+css的图片展示93

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Qt编程基础 | 第六章-窗体 | 6.1、主窗体QMainWindow类

一、主窗体QMainWindow类 1.1、简介 QMainWindow是为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menu bar&#xff09;、多个工具栏&#xff08;tool bars&#xff09;、多个锚接部件&#xff08;dock widgets&#xff09;、一个状态栏&#xff08;status …

基于jmeter完成压测

&#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司实习&#x1f…

FLEXPART拉格朗日粒子扩散模式建模技术及研究大气污染物源-汇关系中的实践经验与技巧

拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹&#xff0c;来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。 该模式既可以通过时间的前向运算来模拟示踪物由源区向周围的扩散&#xff0c;也可以通过后向运算来确…

剑指offer -- 二维数组中的查找

二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 暴力查找法: 是一种简单直接的解决方法&#xff0c;可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素&#xff0c;逐个与目标值进行比较。 具体步骤如下&#xff1a; 从数组的第一行第一列开始&#xff0c;…

Scala学习(十)---Set和Map

文章目录 1.Set集合1.1 不可变Set1.2 可变Set 2.Map2.1 不可变Map2.2 可变map 3.元组 1.Set集合 1.1 不可变Set 创建一个不可变set val setSet(1,2,3,4,6,5,4,4)println(set)//判断此set是否为不可变HashSetval bool set.isInstanceOf[HashSet[Int]]println(bool)运行&#…

考研数据结构--图

文章目录 图图的基本概念图的定义种类 图的抽象数据类型图的基本术语1. 端点和邻接点2. 顶点的度、入度和出度3. 完全图4. 稠密图、稀疏图5. 子图6. 路径和路径长度7. 回路或环8. 连通、连通图和连通分量9. 强连通图和强连通分量在一个图中找强连通分量的方法 10. 权和网 图的存…

如何在华为OD机试中获得满分?Java实现【统计匹配的二元组个数】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

基于openfaas托管脚本的实践

作者 | 张曦 一、openfaas产品背景 在云服务架构发展之初&#xff0c;这个方向上的思路是使开发者不需要关心搭建和管理后端应用程序。这里并没有提及无服务器这个概念&#xff0c;而是指后端基础设施由第三方来托管&#xff0c;需要的基础架构组建均以服务的形式提供&#x…

list的模拟实现

第一步&#xff1a;看源代码 类的框架&#xff1a; 成员函数&#xff1a; 基本可以确定list是一个带头双向循环链表&#xff0c;end()的迭代器指向头节点&#xff0c;begin()的迭代器指向头结点的下一个节 list的迭代器&#xff1a;&#xff08;稍显复杂&#xff09; 库中的迭代…

5节点系统潮流计算-牛拉法和PQ分解法(代码+报告)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该部分资料是牛拉法和PQ分解法两种潮流计算方法的代码和对应的资料&#xff0c;程序针对5节点系统&#xff0c;也可以自行修改节点和线路参数改成其他节点系统&#xff0c;程序通用性较强&#xff0c;注释清晰…

电脑没有声音了怎么恢复?3个实用方法分享!

案例&#xff1a;我想在电脑上看电影、听音乐&#xff0c;但是我发现电脑没有声音&#xff0c;这种情况让我感到很困扰&#xff0c;有没有解决的方法&#xff1f; 【我的电脑没有声音&#xff0c;这非常影响我的使用。电脑没有声音是什么问题&#xff1f;有没有小伙伴知道解决…

Recurrent Neural Network(循环神经网络)

目录 Slot Filling with RNN Elman Network & Jordan Network Bidirectional RNN LSTM(Long Short-term Memory) Example Learning Target LSTM GRU (Gated Recurrent Unit) More Applications Many to One Many to Many Speech Recognition Sequence to Sequ…

一大波物联网毕业设计选题推荐(配套源码、文档、开发板)

以下项目整体综合性比较强&#xff0c;更贴近于产品化&#xff0c;并且基本都包含微信小程序与物联网云平台的联动&#xff0c;每个项目均配套详细的项目开发文档、程序源码&#xff0c;非常适合作为物联网毕业设计选题。项目文档及源码在文章末尾可免费下载。 另外&#xff0…