
C语言实战-手写数据库内核组件
文章平均质量分 95
以C语言实战为主,为了快速进入手写数据库内核的状态,将数据库内核基础组件拆分出,与数据库业务不再相关,来练习综合编程能力,这样在看手写数据库内核代码时绝对容易很多,快来吧,让自己变成高手!
韩楚风
多年服务端开发经验,目前在做数据库内核研发,希望和大家多交流数据库和产品研发方面的经验^.^
展开
-
【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式
本文介绍了链表节点为不同数据类型时的处理方法,定义了抽象类型后使引用的类型统一,同时在遍历树形链表时,对于成员仍为链表时,采用深度优先的递归遍历。这种链表在数据库内核中应用比较广泛,比如在SQL语法解析时,将语法的各子句解析成不同的数据类型,而像select子句,可以写多个列名,该子句内部又以链表形成存储列信息。原创 2024-07-07 10:56:17 · 504 阅读 · 36 评论 -
【手写数据库内核组件】0102 链表的类型,单向链表,双向链表,循环链表,二叉树,多路树等类型以及它们的特点,物尽其用
程序就是算法 + 数据结构, 今天我们就来看看最基础的数据结构——链表。在实际软件应用中,经常需要存储数据,往往存储的数据量在运行时会随着情况的变化而变化;而链表就是一个很好的容器,可以很好的应对变化,不仅对于链表中的数据插入删除,还是不断新增数据。基于链表,可以实现多种数据结构,如队列,栈,树等。本章节就来分享一下链表的形式。原创 2024-08-28 08:48:19 · 1435 阅读 · 183 评论 -
【手写数据库内核组件】0103单链表的分层设计,一套能复用的链表组件,操作原理与详细实现
前面几节介绍了链表的各种形式与应用,从本节开始进入到实战阶段,从开发大型软件角度,来看这些链表结构如何实现;这里的实现与初学时的例子会有很大的区别,在大型软件中,链表常常作为一个公共组件出现,开发者更多的是调用和使用,所以它必须有非常好的扩展性,能够承载很多数据类型,而链表算法非常稳定,不需要再次重写;虽然链表是很小的一个组件,不仅仅需要编码实现,也会有设计思想的融合,最后还会对它的功能和性能的分析。原创 2024-09-04 08:15:19 · 2275 阅读 · 122 评论 -
【手写数据库内核组件】0104双向循环链表,麻雀虽小也需要精心设计,整体分层抽象,遍历的多种形式
前文介绍了单向链表,它结构简单易用,但是需要对数据经常随机插入和删除的场景,就显得非常麻烦,需要遍历找到前驱节点。今天来分享一下双向循环链表,每个节点有前继与后继指针,同时它链表的头和尾也是相连的,这样就可以在任意位置开始遍历。本文就来介绍双向循环链表有那些操作,来设计一个通用的双向循环链表组件。原创 2024-09-06 19:00:15 · 1723 阅读 · 183 评论 -
【手写数据库内核组件】0201 哈希表hashtable的实战演练,多种非加密算法,hash桶的冲突处理,查找插入删除操作的代码实现
hash表的应用非常广泛,在网上也可以看到分享的各种hash表的实现,都比较概念化。本章节从实战的角度出发,以数据库内核中的应用为例,来看看hash表的原理与实现。原创 2024-07-07 15:25:54 · 3949 阅读 · 174 评论 -
【手写数据库内核组件】0202分段哈希表Partial Hash Table,大并发场景下提升hashTable的吞吐量,可变分段算法快速定位segment位置
本文分享了分段hash表的实现与原理,在高并发场景下,为了hash操作的一致性,又同时提升hash表的吞吐量,采用分段hash,在没有hash段冲突时,可以同时进行N个并发操作,N即为段的数量。对于分段的原量,分享了段数量可变的分段方法,通过计算段数量的2的幂,来动态确定占用的二进制位的数量,生成对应的段掩码。原创 2024-07-11 07:38:24 · 2026 阅读 · 105 评论 -
【手写数据库内核组件】0301 缓存模型介绍,缓存分层架构与缓存映射算法,以及缓存淘汰替换算法,同步一致的策略
缓存这一组件,在高性能软件中是个必选项,当然数据库中也是必不可少的模块。缓存有各种各样的实现方式,尤其缓存的替换算法孰好孰劣,比较不断。针对不同的数据,用途,在数据库中有多种形式的缓存,本文就来介绍数据库中用到的缓存形式。原创 2024-08-12 20:13:47 · 2363 阅读 · 194 评论 -
【手写数据库内核组件】0302 数据缓存池(一),数据块缓存池的三层架构与两级映射,缓存块与物理数据的对应关系
在数据库中有多种缓存使用场景,其中最大的缓存是表数据的缓存,一般作为多个并发的共享缓存池来使用。表数据从磁盘先加载到缓存池中,数据库对数据的所有操作都在缓存中进行,这避免了频繁对磁盘的读写操作;同一块数据在缓存池中只加载一次,所以会存在并发访问。这就要求缓存池支持并发访问,同时在大并发时有一定的扩展性,加大并发时缓存不能成为性能瓶颈;同时缓存有上限,支持淘汰替换机制。本节分享基于时钟算法的共享缓存池的实现机制。原创 2024-08-19 08:05:35 · 1399 阅读 · 93 评论 -
【手写数据库内核组件】0303 数据缓存池(二) 缓存块使用前需要固定,缓存加载与无效,无锁的替换算法
继续数据缓存池的分享,继上节通过hashTable查找缓存数据块,如果找到之后会对数据块缓存进行操作,本节重点对数据块缓存操作时的注意事项与实现流程进行分析。原创 2024-08-21 07:30:55 · 1586 阅读 · 156 评论 -
【手写数据库内核组件】0304 缓存策略,缓存经典穿透,击穿,雪崩,抖动问题,在缓存池中实战中的解决与应对
一般增加缓存是为了减少IO次数,让更多业务需要的数据驻留在内存中,提升整体的性能。但是引入缓存后,会带来缓存穿透、抖动、击穿、雪崩的问题;本节就来看一看这些问题在我们实现的缓存池上如何解决的。原创 2024-08-26 08:17:54 · 1367 阅读 · 108 评论 -
【手写数据库内核组件】0401 动态内存池,频繁malloc/free让系统不堪重负,动态内存池让应用自由使用动态内存
在动态内存使用频繁的应用程序中,不仅与操作系统交互多,而且会造成大量的内存碎片,增加额外的系统负担。本文分享了通过动态内存池的方法,每次申请一个内存页,然后在当有动态内存需要时,进行切分,可以避够内存碎片的产生。当然也存在很多可优化的地方,在释放时可以保留一部分内存页在freeList中,这样进一步减少与操作系统的交互。原创 2024-07-13 06:00:00 · 3202 阅读 · 131 评论 -
【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧
现代的CPU都会采用多个core的形式具有并行执行的能力,同一时间可以打开多个应用程序,即使是我们的手机,它的CPU也是非常强大的多核处理器。如何让我们开发的应用程序充分利用多核CPU呢,这就不得不说多线程模型。本文就来分享一下多线程模型的搭建与使用。原创 2024-07-17 08:45:55 · 3004 阅读 · 133 评论 -
【手写数据库内核组件】0601数据库执行引擎常用的火山模型,与其它模型比较,实现原理以及解释器和迭代器的实现
数据库的执行引擎的常见模型:* 火山模型/迭代模型,采用自顶向下拉取数据的模式,执行计划生成树状结构的操作节点树,从根开始执行,每个操作都会有一个next方法,来获取下一条数据,操作之间也只传递一条数据。* 编译模型/物化模型,采用向上推送的模式,从最低层操作执行,每个操作将数据输出,作为下一个父操作的输入;这种模型以数据为中心,可以有效利用cache,各操作之间数据获取可以提升cache的命中率。* 向量模型/批处理模型,也是迭代模式执行,不同之处在于,每个操作会处理一批数据,生成的输出也是一组数原创 2024-07-25 07:32:19 · 3485 阅读 · 166 评论 -
【手写数据库内核组件】0602 火山模型的节点基础节点类型,节点的作用与结构定义,预分配来优化性能
本文主要分享了火山执行器模型中的四种基本节点类型:投影节点,选择节点,嵌套节点,扫描节点,以及它们的功能与节点结构的定义。原创 2024-08-08 07:55:29 · 1672 阅读 · 110 评论 -
【手写数据库内核组件】0603 火山模型节点的执行框架,详细执行流程,体会其中的设计模式
上一节介绍了火山模型执行器中的四个基础节点类型:投影节点,选择节点,嵌套节点,扫描节点;以及四种节点的作用与结构定义。本节来分享一下这四种节点的执行框架,节点的初始化,节点执行,迭代获取数据,以及数据的输入输出流程。原创 2024-08-10 12:00:11 · 1913 阅读 · 124 评论 -
【手写数据库内核组件】0701 简洁高效的运行日志模块,在多线程下并发下写入日志信息,多种日志级别和代码位置信息记录
日志模块是一个软件的基础模块,虽然有一些开源的日志系统,但是选择一个简洁而高效的日志模块,在软件运行过程中产生大量日志时,还能高效的运行,这非常关键。原创 2024-07-20 15:33:50 · 1778 阅读 · 177 评论 -
【手写数据库内核组件】1001词法分析器,语言被程序识别的第一步,将语句分解为最小词根token
本文介绍了词法分析的流程,规则匹配,以及分解token的机制,当然不同的语言,规则的复杂度也不同;它是一套通用的流程,因此诞生了很多优秀的词法分析工具,只需要定义规则,就能高效的完成分词的处理。原创 2024-09-20 16:00:51 · 3953 阅读 · 173 评论