- 博客(214)
- 资源 (22)
- 问答 (2)
- 收藏
- 关注
原创 【手写数据库内核miniToadb】第5天 数据库模块解析器的介绍
这种类型存储逻辑判断的结果,解析为整型,实际存储也为整型,但在查询显示时,根据表定义的类型,当整型值为0时转为字符f,当整型值为1时转换字符t。当然在SQL的定义语句中还用到了括号,表达一种属于的语义,比如表的定义当中,属于表的所有字段的定义,用括号包围起来,括号内属于内部层级,括号外是表的整体信息层级,像是两级树形结构一样。在SQL语句当中,除了命令,数据之外,还有一些用于起分隔作用的符号,作用类似于自然语言中的标点符号,对SQL中的各部分进行有效的切分,使得表达准备的语义,避免歧义的产生,使表达清晰。
2025-02-07 08:33:25
22
2
原创 【手写数据库内核miniToadb】第4天 词法分析器demo实现,单词分词与统计
在学习C语言编程时肯定做过这样一道编程题,统计一段英文文章中的字符数量,单词数量,行的数量。flex是一个高效的词法分析工具,同时它定义规则非常的简单,同时flex工具可以将这些规则转换为C语言代码,这样与项目程序可以很好的融合在一起。这样一个编程题,背后逻辑其实是对自然语言的处理,首先识别出来语言中的最小单元–单词,之后就是按单词的意思,还有一句话中单词的顺序来解析它的含义。如果用flex工具来实现,只需要定义分词的规则即可,不再考虑实现逻辑,专注于要做的分词规则。直接就可以输入一段英文短文
2025-01-13 13:26:10
125
38
原创 【手写数据库内核miniToadb】第3天 SQL解析工具的准备,flex与bison
解析器准备解析器准备额,SQL发展到今天已经是非常庞大的体系,要想将它完全实现已经不可能,即使是商业数据库中也是大部分的实现。对于如此复杂的语言,从头开始字符的解析程序开发,已经没有意义,也与数据库内核的内容不符,所以在SQL解析模块中引入两个成熟的工具flex和bison,它们是业界著名的语言解析工具,在编译器,数据库等各领域的前端语言分析中应用广泛。1 词法分析工具flexFlex起源于1975年由Mike Lesk和Eric Schmidt编写的lex工具。
2024-12-27 08:37:30
3371
84
原创 【手写数据库内核miniToadb】第2天 与数据库交互的桥梁--SQL解绍
源码编辑器可以使用流行的VScode,支持跨平台,当然也可以使用Eclipse,或者自己熟悉的其它工具,不同编辑器之间的默认字符集可能不同,最好设置为UTF-8,Linux下的换行模式,统一的格式避免一些奇妙的问题。上一节通过一个简单的C语言程序来模拟数据库的行为,从处理能力来看,也有创建表,插入、删除、更新、查询等操作,但是与大家认为的数据库差距很大。按功能的不同,将SQL划分为DQL,DDL,DML,DCL等类型,经常使用的查询,插入更新等就属于DQL和DML范围。2.3 SQL标准的发展。
2024-12-22 07:06:39
3656
184
原创 【手写数据库内核miniToadb】第1天 模拟数据库流程,剖析数据库内核的组成结构
解析器就是将用户输入的命令字符串转换为程序内部的数据结构,然后就可以执行命令并返回结果。通过一个简单的C程序来看一下数据库的解析和执行流程。
2024-12-16 13:31:59
4737
178
原创 【PostgreSQL使用】最新功能逻辑复制槽的failover,大数据下高可用再添利器
使用数据库除了存取数据快捷以外,还有一个非常重要的目的,就是它有一整套的机制来保障数据访问的高可用,持续性。当然逻辑复制也不例外,当我们正在订阅的主库故障发生主备切换时,仍然希望数据库对象的变更订阅不会丢失,能持续收到发布者的消息。这在以往的PostgreSQL版本中是没有的,最新的PostgreSQL 17版本终于完善了这一功能,逻辑复制支持了failover特性,提升了逻辑复制的高可用性。本文通过搭建逻辑复制的failover部署,来试一试逻辑复制的failover倒底如何。
2024-11-29 11:22:44
8154
345
原创 PostgreSQL内核源码分析 逻辑复制基本流程,发布订阅创建背后的故事
PostgreSQL中如何实现逻辑复制功能呢?我们从几个方面来逐层展开介绍,首先介绍一下逻辑复制的代码结构,再来看一下产生通知的流程,以及如何应用到备份。本文就来分享一下逻辑复制的代码框架结构,在整体上对逻辑复制有初步的认识。
2024-11-22 09:56:24
6589
162
原创 【postgresql初级使用】逻辑复制是对数据库对象进行复制,非常灵活的完成数据归集与分发
在PostgreSQL中逻辑复制是一个非常实用的功能,因为它可以指定数据库对象进行复制,甚至可以指定到列,没有指定的列可以不复制,这就非常灵活。可以用于数据的汇集,也可以用于数据的分类,特定数据的分发或备份等。当然,逻辑复制非常灵活,在部署时一定要先设计好数据复制的路径,避免产生复制的循环,比如A复制到B,B又复制到A,这样数据就会越来越多。
2024-11-14 08:49:20
7552
228
原创 【linux 多进程并发】0203 网络资源的多进程处理,子进程完全继承网络套接字,避免“惊群”问题
本节主要分享了网络套接字在父子进程中的继承的情况。可以通过验证发现,父启动监听后,此时创建子进程,在子进程中也继承了监听套接字,它也可以与客户端建立连接;而父进程中的监听套接字,也仍然可以与客户端建立连接。当然其它网络操作步骤也是一样的,在父子进程中相同的套接字都会收到相同的网络事件,但最终只有一个进行处理,这样就带来一个问题,其它不处理事件的套接字会被频繁唤醒。
2024-11-05 11:58:09
2096
202
原创 【linux 多进程并发】0302 Linux下多进程模型的网络服务器架构设计,实时响应多客户端请求
本文主要介绍了基于多进程架构的网络服务器的设计与实现,在多进程架构中每个客户端会有一个服务端的进程专门处理通信,增加了对客户端消息的响应效率,提升了并发处理能力。
2024-10-30 08:28:43
2490
195
原创 【linux 多进程并发】0301 Linux创建后台服务进程,daemon进程,自己的进程可以被一号进程接管啦
通常我们在终端启动程序,该程序的父进程一般是终端进程,这样在终端退出时,会产生像SIGHUG信号发给所有子进程,子进程默认处理是退出。我们要创建后台服务进程时,必需让进程与终端无关,这就是示例代码中经过一次fork之后,父进程退出,而子进程让systemd接管的真正作用。本章节代码位于[gitcode](https://gitcode.com/toadb/hatchCode/overview), 路径为: multiProcess/ex02_multiprocess, 有兴趣的同学可以下载测试,当然
2024-10-22 18:47:14
2287
198
原创 【linux 多进程并发】0202 Linux进程fork之后父子进程间的文件操作有着相同的偏移记录,多进程操作文件的方法
好了,到这里,子进程是父进程的拷贝有了更加深入的理解,这里像编程语言中的深拷贝与浅拷贝的关系。而子进程其实是做了一些浅拷贝,引用的内核文件表项还是一份,这就会引起两个进程共同操作的问题。在这种情况下,每次操作需要加锁,同时要指定操作的位置和大小。
2024-10-17 10:24:21
1937
168
原创 【linux 多进程并发】0201 Linux进程fork内存空间,父子进程变量内存地址居然是一样的
在多任务并发编程中,使用多进程架构时,在使用fork创建的父子进程时,子进程得到与父进程相同的内存空间内容。进程的内存空间由虚拟地址描述,在使用时会映射到物理地址。
2024-10-11 07:39:21
1761
162
原创 【linux 多进程并发】0102 linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
本文介绍了linux平台下进程的基本状态,这些状态经过细化后对应进程生命周期中的各阶段;进程从创建启动之后,就处于一个有限状态机中,从就绪,运行,可中断阻塞,不可中断阻塞之间进行转换,直到进程的终止。
2024-09-29 15:02:07
5464
206
原创 【linux 多进程并发】0101 linux下使用常见命令,来解析进程家族体系脉络
本文介绍了Linux系统平台下进程的相关概念,在Linux下所有进程是有继承关系的,最初的1号和2号进程分别是用户进程和内核进程的祖先,通过 `ps`,`top`,`kill`三个常用的命令,就可以查看进程信息,资源占用情况,以及结束进程。
2024-09-27 11:29:10
2012
114
原创 【手写数据库内核组件】1001词法分析器,语言被程序识别的第一步,将语句分解为最小词根token
本文介绍了词法分析的流程,规则匹配,以及分解token的机制,当然不同的语言,规则的复杂度也不同;它是一套通用的流程,因此诞生了很多优秀的词法分析工具,只需要定义规则,就能高效的完成分词的处理。
2024-09-20 16:00:51
3750
174
原创 【手写数据库内核组件】0104双向循环链表,麻雀虽小也需要精心设计,整体分层抽象,遍历的多种形式
前文介绍了单向链表,它结构简单易用,但是需要对数据经常随机插入和删除的场景,就显得非常麻烦,需要遍历找到前驱节点。今天来分享一下双向循环链表,每个节点有前继与后继指针,同时它链表的头和尾也是相连的,这样就可以在任意位置开始遍历。本文就来介绍双向循环链表有那些操作,来设计一个通用的双向循环链表组件。
2024-09-06 19:00:15
1622
184
原创 【手写数据库内核组件】0103单链表的分层设计,一套能复用的链表组件,操作原理与详细实现
前面几节介绍了链表的各种形式与应用,从本节开始进入到实战阶段,从开发大型软件角度,来看这些链表结构如何实现;这里的实现与初学时的例子会有很大的区别,在大型软件中,链表常常作为一个公共组件出现,开发者更多的是调用和使用,所以它必须有非常好的扩展性,能够承载很多数据类型,而链表算法非常稳定,不需要再次重写;虽然链表是很小的一个组件,不仅仅需要编码实现,也会有设计思想的融合,最后还会对它的功能和性能的分析。
2024-09-04 08:15:19
2144
123
原创 【手写数据库内核组件】0102 链表的类型,单向链表,双向链表,循环链表,二叉树,多路树等类型以及它们的特点,物尽其用
程序就是算法 + 数据结构, 今天我们就来看看最基础的数据结构——链表。在实际软件应用中,经常需要存储数据,往往存储的数据量在运行时会随着情况的变化而变化;而链表就是一个很好的容器,可以很好的应对变化,不仅对于链表中的数据插入删除,还是不断新增数据。基于链表,可以实现多种数据结构,如队列,栈,树等。本章节就来分享一下链表的形式。
2024-08-28 08:48:19
1374
185
原创 【手写数据库内核组件】0304 缓存策略,缓存经典穿透,击穿,雪崩,抖动问题,在缓存池中实战中的解决与应对
一般增加缓存是为了减少IO次数,让更多业务需要的数据驻留在内存中,提升整体的性能。但是引入缓存后,会带来缓存穿透、抖动、击穿、雪崩的问题;本节就来看一看这些问题在我们实现的缓存池上如何解决的。
2024-08-26 08:17:54
1286
109
原创 【手写数据库内核组件】0303 数据缓存池(二) 缓存块使用前需要固定,缓存加载与无效,无锁的替换算法
继续数据缓存池的分享,继上节通过hashTable查找缓存数据块,如果找到之后会对数据块缓存进行操作,本节重点对数据块缓存操作时的注意事项与实现流程进行分析。
2024-08-21 07:30:55
1502
157
原创 【手写数据库内核组件】0302 数据缓存池(一),数据块缓存池的三层架构与两级映射,缓存块与物理数据的对应关系
在数据库中有多种缓存使用场景,其中最大的缓存是表数据的缓存,一般作为多个并发的共享缓存池来使用。表数据从磁盘先加载到缓存池中,数据库对数据的所有操作都在缓存中进行,这避免了频繁对磁盘的读写操作;同一块数据在缓存池中只加载一次,所以会存在并发访问。这就要求缓存池支持并发访问,同时在大并发时有一定的扩展性,加大并发时缓存不能成为性能瓶颈;同时缓存有上限,支持淘汰替换机制。本节分享基于时钟算法的共享缓存池的实现机制。
2024-08-19 08:05:35
1328
93
原创 【手写数据库内核组件】0301 缓存模型介绍,缓存分层架构与缓存映射算法,以及缓存淘汰替换算法,同步一致的策略
缓存这一组件,在高性能软件中是个必选项,当然数据库中也是必不可少的模块。缓存有各种各样的实现方式,尤其缓存的替换算法孰好孰劣,比较不断。针对不同的数据,用途,在数据库中有多种形式的缓存,本文就来介绍数据库中用到的缓存形式。
2024-08-12 20:13:47
2268
195
原创 【手写数据库内核组件】0603 火山模型节点的执行框架,详细执行流程,体会其中的设计模式
上一节介绍了火山模型执行器中的四个基础节点类型:投影节点,选择节点,嵌套节点,扫描节点;以及四种节点的作用与结构定义。本节来分享一下这四种节点的执行框架,节点的初始化,节点执行,迭代获取数据,以及数据的输入输出流程。
2024-08-10 12:00:11
1817
125
原创 【手写数据库内核组件】0602 火山模型的节点基础节点类型,节点的作用与结构定义,预分配来优化性能
本文主要分享了火山执行器模型中的四种基本节点类型:投影节点,选择节点,嵌套节点,扫描节点,以及它们的功能与节点结构的定义。
2024-08-08 07:55:29
1597
111
原创 PostgreSQL入门与进阶学习,体系化的SQL知识,完成终极目标高可用与容灾,性能优化与架构设计,以及安全策略
对于后端开发者而言,对数据库的熟悉程度不仅是岗位需求的基础,更是职业发展中不可或缺的一环,其全面性对于技术定级具有显著的推动作用。在选择学习的数据库时,建议从广泛应用的postgresql入手,因其在互联网领域占据重要地位。接下来,让我们逐步深入,从基础到进阶,系统梳理数据库技术的关键点。
2024-07-28 10:58:09
3845
259
原创 【手写数据库内核组件】0601数据库执行引擎常用的火山模型,与其它模型比较,实现原理以及解释器和迭代器的实现
数据库的执行引擎的常见模型:* 火山模型/迭代模型,采用自顶向下拉取数据的模式,执行计划生成树状结构的操作节点树,从根开始执行,每个操作都会有一个next方法,来获取下一条数据,操作之间也只传递一条数据。* 编译模型/物化模型,采用向上推送的模式,从最低层操作执行,每个操作将数据输出,作为下一个父操作的输入;这种模型以数据为中心,可以有效利用cache,各操作之间数据获取可以提升cache的命中率。* 向量模型/批处理模型,也是迭代模式执行,不同之处在于,每个操作会处理一批数据,生成的输出也是一组数
2024-07-25 07:32:19
3346
167
原创 【手写数据库内核组件】0701 简洁高效的运行日志模块,在多线程下并发下写入日志信息,多种日志级别和代码位置信息记录
日志模块是一个软件的基础模块,虽然有一些开源的日志系统,但是选择一个简洁而高效的日志模块,在软件运行过程中产生大量日志时,还能高效的运行,这非常关键。
2024-07-20 15:33:50
1689
178
原创 【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧
现代的CPU都会采用多个core的形式具有并行执行的能力,同一时间可以打开多个应用程序,即使是我们的手机,它的CPU也是非常强大的多核处理器。如何让我们开发的应用程序充分利用多核CPU呢,这就不得不说多线程模型。本文就来分享一下多线程模型的搭建与使用。
2024-07-17 08:45:55
2879
134
原创 【手写数据库内核组件】0401 动态内存池,频繁malloc/free让系统不堪重负,动态内存池让应用自由使用动态内存
在动态内存使用频繁的应用程序中,不仅与操作系统交互多,而且会造成大量的内存碎片,增加额外的系统负担。本文分享了通过动态内存池的方法,每次申请一个内存页,然后在当有动态内存需要时,进行切分,可以避够内存碎片的产生。当然也存在很多可优化的地方,在释放时可以保留一部分内存页在freeList中,这样进一步减少与操作系统的交互。
2024-07-13 06:00:00
3063
132
原创 【手写数据库内核组件】0202分段哈希表Partial Hash Table,大并发场景下提升hashTable的吞吐量,可变分段算法快速定位segment位置
本文分享了分段hash表的实现与原理,在高并发场景下,为了hash操作的一致性,又同时提升hash表的吞吐量,采用分段hash,在没有hash段冲突时,可以同时进行N个并发操作,N即为段的数量。对于分段的原量,分享了段数量可变的分段方法,通过计算段数量的2的幂,来动态确定占用的二进制位的数量,生成对应的段掩码。
2024-07-11 07:38:24
1925
106
原创 【手写数据库内核组件】0201 哈希表hashtable的实战演练,多种非加密算法,hash桶的冲突处理,查找插入删除操作的代码实现
hash表的应用非常广泛,在网上也可以看到分享的各种hash表的实现,都比较概念化。本章节从实战的角度出发,以数据库内核中的应用为例,来看看hash表的原理与实现。
2024-07-07 15:25:54
3808
175
原创 【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式
本文介绍了链表节点为不同数据类型时的处理方法,定义了抽象类型后使引用的类型统一,同时在遍历树形链表时,对于成员仍为链表时,采用深度优先的递归遍历。这种链表在数据库内核中应用比较广泛,比如在SQL语法解析时,将语法的各子句解析成不同的数据类型,而像select子句,可以写多个列名,该子句内部又以链表形成存储列信息。
2024-07-07 10:56:17
494
37
原创 【postgresql初级使用】用户与角色的关系,搭建数据库安全体系中的分权管理
在数据库中有一套严格的访问控制策略,它是基于数据库用户,也就是说一个数据库对象,如database,可以给不同用户没的访问权限,如用户user1,有只读访问权限,用户user2有创建表的权限等等,通过这一套访问权限来保证数据的安全。在postgresql中,访问数据的前提是以用户的形式登陆数据库,不同的用户被赋予不同的权限。拥有相同权限的一组用户,可以被标记为同一种角色,这与现实社会是类似的,如保管员角色,工人角色,它们访问生产资料的权限和使用方式也是不同的。本节就来分享一下postgresql中
2024-07-04 10:21:51
2563
86
原创 【postgresql初级使用】数据库安全防护,核心数据是黑客的终极大boss,多层次建立安全体系
数据库作维护着系统的全部核心数据,在黑客眼中,它就是终极大boss,需要我们精心呵护。常常听到撞库,拖库,甚至于删库跑路等事件,我们在部署和维护数据库过程中如何防范这些风险呢?本文介绍数据库访问安全保护的一些方式,结合postgresql 数据库中有一些安全功能,同时还需要配合操作系统,以及网络部署的一起达到数据库的安全。
2024-06-29 13:40:44
11818
157
原创 揭示数据库内核的奥秘--手写数据库toadb开源项目
toadb数据库架构是一个精心设计、高效运作的系统,它承载着数据的存储、查询、处理和分析等多重任务。从SQL输入到数据返回,经过词法/语法解析,生成逻辑/物理执行计划树,递归执行(火山模型),数据按列分组存储(PAX模型), 每一步都经过精心优化,确保用户能够高效、准确地获取所需信息。
2024-06-21 08:51:46
7098
205
原创 【postgresql初级使用】触发器的enable与disable,可以自动化精准管理触发器,避免重写触发器复杂逻辑
通过对触发器的启用和禁用,来精确管理触发器的使用,让触发器的定义一直保持在系统当中。
2024-06-19 13:29:14
4025
83
原创 【postgresql初级使用】条件表达式触发器,兼顾DML执行性能,又能执行复杂逻辑,只在结帐时计算总帐
本章节分享了通过表达式条件来限制触发器执行,这样不仅提升DML操作的性能,同时还能利用触发器实现复杂的功能。最后通过一个经典的帐单结算的案例,演示了条件触发器,会在订单转为完成状态时自动生成帐单。
2024-06-18 07:20:01
2257
81
原创 【postgresql初级使用】事件触发器event trigger,被忽略的table rewrite,组合策略保障重大操作
postgresql 中的事件触发器,可以指定的事件有 `ddl_command_start` ` ddl_command_end` `table_rewrite` `sql_drop`, 它可以让我们制定对这些事件的约束策略,当然也可以实现之前的审计案例。其中特别要注意表的重写事件,它是一个经常被忽视,对业务影响非常大的事件,可以通过一系列规则进行限制。
2024-06-13 08:22:00
3518
127
原创 【postgresql初级使用】视图上的触发器instead of,替代计划的rewrite,实现不一样的审计日志
在视图上的instead of 触发器,可以将原本的执行计划重写 替换为触发器执行,这样可以进行更为复杂的动作,这里以审计为例,演示了触发器的效果。
2024-06-08 09:03:44
3240
149
C 链式基数排序的代码实现
2024-08-23
C语言指针 指针的奇特用法与案例
2024-08-23
项目源码 词法语法分析器设计 一款从零开始的数据库内核
2024-08-23
C语言struct与文件读写的课程实验
2024-05-25
手写数据库内核 C语言版 内含源码
2024-02-18
C语言编写烟花效果的代码
2024-02-13
linux文件映射加载
2023-04-13
数据库未来发展有哪些方向呢?
2023-04-01
TCP如何感知对端不存在的
2023-01-29
软件国产化中有那些方面难度比较大?
2023-01-19
关于#小池注水#的问题,如何解决?
2023-01-13
在postgresql 中,如何把拼接的字符串当变量名使用?
2016-09-23
postgresql 中如何确定表的各字段?
2016-09-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人