![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据库开发
文章平均质量分 85
fpcc
行之苟有恒,久久自芬芳!
展开
-
mysql源码分析——InnoDB的磁盘结构之表空间格式
对表空间的文件类型和格式进行分析说明原创 2022-11-12 12:21:49 · 647 阅读 · 0 评论 -
mysql源码分析——InnoDB的磁盘结构之日志文件格式分析
对RedoLog的日志从内存到文件系统的格式及相关代码进行分析原创 2022-11-05 10:55:57 · 798 阅读 · 0 评论 -
mysql源码分析——InnoDB的磁盘结构源码分析
对InnodB的磁盘结构源码数据结构进行基本的分析说明原创 2022-10-30 18:12:31 · 535 阅读 · 0 评论 -
mysql源码分析——InnoDB的磁盘结构
对MySql的磁盘结构进行整体的分析说明原创 2022-10-28 16:51:52 · 681 阅读 · 0 评论 -
mysql源码分析——InnoDB的内存应用整体架构源码
对MYSQL的Buffer Pool的整体应用框架流程进行宏观层上的说明分析原创 2022-10-27 16:45:42 · 1136 阅读 · 0 评论 -
mysql源码分析——InnoDB的内存应用源码
对InnoDB内存数据的应用进行一个基本的分析说明原创 2022-10-26 17:41:53 · 851 阅读 · 0 评论 -
mysql源码分析——InnoDB的内存结构源码
对InnoDB的内存的基本数据结构进行分析说明原创 2022-09-12 11:40:32 · 1301 阅读 · 0 评论 -
mysql源码分析——InnoDB的内存结构分析
对InnoDB中的四类内存数据结构进行分析原创 2022-08-27 15:06:51 · 751 阅读 · 0 评论 -
mysql源码分析——InnoDB引擎启动分析
对InnoDB的启动进行一个基本的流程分析原创 2022-08-13 15:24:28 · 1805 阅读 · 0 评论 -
mysql源码分析——聚簇索引
对聚集索引和其相关的主键索引进行源码分析原创 2022-07-31 11:18:49 · 561 阅读 · 0 评论 -
mysql源码分析——索引的数据结构
MYSQL数据库索引的数据结构的分析原创 2022-07-24 10:29:25 · 762 阅读 · 0 评论 -
mysql源码解读——事务管理
一、事务(Transaction)事务是什么?按照书上说的就是系统的一套操作为了保持数据的完整性必须符合ACID的特性,即原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、 持久性(Durability)。原子性比较好理解,操作要么全执行完成,要么全不执行完,实现这种方式就要支持回滚操作。而一致性指的是事务在改变状态时,要保证所有的访问得到的结果是相同的。一致性有强弱之分,还有区块链中常用的最终一致性。隔离性就比较好理解了,其实就是事务间的操作(并发时)不能互相影响,原创 2022-03-06 14:50:01 · 1143 阅读 · 0 评论 -
mysql源码解读——MVCC
一、什么是MVCCMVCC(Multi-Version Concurrency Control)多版本并发控制,这个玩意儿当初大意过,竟然理解成了源代码的版本控制。傻了巴唧的。MVCC其实是用来做数据安全性的,有过多线程的共享数据控制的编写经验的开发人员,理解起来会更容易一些。后来在区块链中的提高交易速度时,有一些链采用了并行交易,而这其中,对交易的控制管理也使用了MVCC的控制方式。在MySql数据库数据的访问中,多个客户端访问服务端时,如果有读有写,就可能产生数据不一致的现象(脏读和幻读,而具体到为R原创 2022-02-10 11:55:55 · 1562 阅读 · 0 评论 -
mysql源码分析——THD数据结构
一、什么是THD是非常非常不想说这个数据结构的,按照设计原则和设计思想,这个类就是个让人无语的。可存在,就有它的道理,绕是绕不过去的。先看一下它的继承结构:这个类在前面提到过,它是对线程描述的一个数据结构。MySql里用到线程的地方不少,那么理所当然的这个THD类用到的地方也不少。在前面分析网络操作的时候儿就看到这个类的身影,讲真,是不想分析这个类的,不是说这个类多难,是这个类承载的东西太多。本身线程自己的定义就承载了很多相关的信息,再在此基础上进行抽象封装的THD类,一定是更多,但是不分析,又绕不过原创 2022-01-02 19:20:44 · 2732 阅读 · 0 评论 -
mysql源码解读——数据到文件之数据
一、数据数据库落盘前面讲了日志,今天分析一下数据的落盘,麻烦的很。但是原理都差不多。在前面的分析已经可以明确知道,在MySql中,不管哪种数据,都是先进入缓存,然后再落盘保存。而在数据库,最重要的是什么?当然是数据,不管你是什么2PC,什么缓存,什么线程等等。最终的目的都是保证数据的安全应用。说的直白一些,就是满足各种SQL语句的操作,支持数据的各种恢复备份以及数据库的迁移。马Sir不是说过,以后是DT时代,数据为王。所以这几年国内数据库产业风声水起。二、数据写入数据的写入是在日志写入后事务提交完成后原创 2021-10-08 17:16:35 · 361 阅读 · 0 评论 -
mysql源码分析——插件访问的观察者模式
一、观察者模式什么是观察者模式?就是有一个家伙在默默的看着你,当你状态到了一定地步就开始搞一些事情,这些事情可能对你有利,也可能不利。当然,一头羊是赶,多头羊也是放,所以一般观察者模式应用于一对比的模式。就好像一个教师观察者一个班的学生一样。任何一个学生违反纪律,教师自动就会把他拎出来“慰问”一下。如果教师不在,但是教师指定了班长或者其它人可以动用“慰问”这个行动,那么能产生同样的结果。明白了吧。观察者模式是一种松耦合的方式,是一种面向接口编程的应用模式,不知道面向接口编程,那就翻一下书,没啥,实现一个原创 2021-10-05 16:47:19 · 519 阅读 · 0 评论 -
mysql源码分析——插件Plugin架构
一、Mysql中的Plugin在程序设计的发展过程中,插件(Plugin)形式的设计存在的时间很长了,这种源于硬件的插件接口设计,优势在于可以很从容的进行不同场景应用的切换,甚至在运行时也可以通过动态的参数配置来实现整个功能应用场景的快速适配。从Eclipse到Idea等IDE开发工具,到实际的项目开发中,只要开发经验较多的程序员一定会遇到过类似的工程实践。插件一般是基于一定的插件协议,通过开放不同的配置文件或者配置窗口来实现软件功能的快速扩展。比如比较常用的多语言插件,可以通过配置不同的参数,使应用程原创 2021-10-03 16:51:29 · 1409 阅读 · 0 评论 -
mysql源码分析——handlerton
一、数据引擎的应用接口Mysql中为了扩展方便,基本上很多模块都是通过插件的形式(Plugin)的方式加载到Mysql主程序上的,这其中不仅有一些日志、状态等插件,还有数据引擎等核心的插件。在Mysql中访问接口的方式主要有两类,一类是通过注册使用观察者模式来调用,另外一类就是数据库引擎通过这个handlerton的方式来实现。在数据存储引擎中,对表及事务的相关操作都是通过这种方式来访问相关的引擎插件的。在帮助文档中是如此描述它的:“handlerton is a singleton structur原创 2021-09-22 08:55:27 · 1576 阅读 · 0 评论 -
mysql源码分析——VIO数据结构
一、VIO数据类型VIO是一个数据结构,在include/violite.h中定义的说明中有一句话“This structure is for every connection on both sides.Note that it has a non-default move assignment operator, so if adding moremembers, you’ll need to update operator=.”,它的意思是说这个数据结构可以用来网络连接的服务端和客户端。后面就是说原创 2021-08-28 15:40:35 · 694 阅读 · 2 评论 -
mysql源码解读——数据到文件之日志
一、数据库数据库,本身有一个库,那应该是有自己的库的管理方式,这种传统的关系型数据库是如何把数据存储到硬盘上呢?文件的组织形式有哪些呢?MySql数据库一般要有两类文件落盘,一类是日志型文件,一类是真正的数据文件,在数据文件中,又包含索引数据和真实数据。这也是经常提到聚簇索引和非聚簇索引的主要原因,因为这两种索引,在硬盘中的存储方式是不一样的。前者本身就是数据的顺序集合,后者是需要二次再通过指针才能查找数据且数据是无法和索引同顺序的。或者这样说可能更明白,由于索引是通过B+树构造的,聚簇索引本身的叶子节原创 2021-08-22 11:14:41 · 497 阅读 · 0 评论 -
mysql源码解读——内存管理之底层数据库
一、内存管理上一篇讨论的Mysql层的内存管理机制,这次讨论innodb层的内存管理。也就是说,分析一下内存和数据库引擎中的应用方式,其实从字面上都可以了解到数据库引擎需要内存怎么做?不外乎是两个硬件之间,即内存和硬盘之间如何缓冲,缓冲如何设置,缓冲的内存如何管理等等。而在内存应用中又有内存池的应用,内存的具体分配算法。这样,内存池、缓冲和具体的内存分配管理就形成了一个普遍的内存处理机制。换句话说,几乎所有的内存和硬盘之间的交互都不外乎是如此。二、底层数据库内存的分配管理1、内存管理在Innodb数原创 2021-07-11 09:05:31 · 655 阅读 · 4 评论 -
mysql源码解读——内存管理MEM_ROOT
一、内存管理这个实在是没办法多说了,就当是沿袭所有框架的做法,自己搞一下内存管理,这样才高大上一样。MEM_ROOT定义在my_alloc.h(include文件夹)。其实内存管理最简单方便的就是统一分配,集中回收,动态调整。话说起来容易,做起来难啊。大牛们哪个不清丝明了的知道,可写一个适配大多数的场景下的这种内存管理代码是极其难的。不然,内存管理也不会上升到一个又一个算法推出的地步。空间和时间的随时变化和内存资源的有限性,不同场合对内存调度的不确定性,都严重影响着编写内存管理者的设计思想。既要保证自己原创 2021-06-27 11:18:58 · 778 阅读 · 2 评论 -
mysql源码解读 -— insert插入的流程
一、插入流程在分析了整个SqlCmd的流程后,下来深入看一下插入数据要做的流程动作,数据库最常用的是查询,但是数据的插入也不遑多让。insert是DML操作,所以仍然从上篇的相关文件即sql_insert.cc开始看起,看它的execute这个虚拟函数是如何执行的,从这里出发,直到文件落盘,大致分为以下几步:1、打开插入表并准备各种检查工作,包括区分Select类型的Insert等。2、锁定表并确定是否启动Bulk插入。3、写记录到表的Buffer,这里就开始进入引擎层。4、提交事务,其中分涉及到原创 2021-06-13 18:15:46 · 2893 阅读 · 5 评论 -
mysql源码解读 -— Sql命令处理流程
一、Sql流程MySql是数据库,这次就分析一下一条SQL语句的流程,流程可能不会全面展开分析,当后面遇到具体的模块时,再由各个模块深入学习。如果使用过MySql的客户端(任意一种都可以),基本的形式就是在客户端写一条SQL语句,然后点击运行,正常的情况下,就会返回这条SQL执行后的结果。可能学习Sql源码的人不少,但学习编译器知识的人就少多了。在SQL语句的执行过程中,其实SQL语句就是一门语言,只不过这门语言相对于其它经常接触到的比如C/c++,JAVA等语言来比,它就是一个小儿科了。但无论怎么小儿原创 2021-06-12 12:11:04 · 1181 阅读 · 4 评论 -
mysql源码解读 — 线程的具体创建
一、MySql中的线程创建方式为了跨平台主要支持WIN和LINUX,在创建的源码中也可以看这两种创建的方式,在源码中可以清晰的看到区别这两的方式仍然使用的经典的宏判断。其实线程落到这里,基本上就回到了传统的线程处理的整个过程,只是看开发者对其是否进行二次封装和抽象。下面看一下相关的代码分析。二、具体源码从上一篇add_connection这个函数开始看:bool Per_thread_connection_handler::add_connection(Channel_info *channel_i原创 2021-06-11 16:21:41 · 391 阅读 · 5 评论 -
mysql源码解读 — 线程池和线程
一、MySql中的线程在mysql中,每一个连接上来,就会分配给一个相关的THD数据类。在前面的分析中可以看到,连接器(Connectors)连接到的直接就是连接池,在连接池的线程处理中分为三部分,即一对一(一个连接对应一个线程),多对一(多个连接对应一个线程)和线程池(多对多)。线程池和线程可以针对不同的具体场景来处理具体的事务,这样既兼顾了效率又提高了适应性,对于新手来说,这就是设计的一个缩影。MySql中的线程较Redis要复杂一些(当然针对的是REDIS6以前版本),在下面的分析中会对三种方式进原创 2021-05-30 14:12:18 · 564 阅读 · 0 评论 -
mysql源码解读 —— 网络服务源码
一、网络通信和服务网络通信是整个MySql的基本服务,包括在此基础上衍生的其它相关服务,构成了Mysql客户端和服务端完成交互的主要方式。主要的功能包括:1、网络初始化和服务初始化:包括参数、服务端和监听等。2、网络交互模块:数据的收发和控制等。3、交互协议模块:包含UNIX SOCKET套接字协议、TCP/IP协议,管道和共享内存(Share Memory)协议四种这三大块基本就覆盖了网络通信和服务的主要的内容。二、主要流程主要的流程基本如下图:网络通信的流程相对Redis来说要简单不少原创 2021-05-23 18:18:13 · 820 阅读 · 0 评论 -
mysql源码解读二 —— 基本框架和流程
一、基本框架整体的框架其实和普通的C/S服务器模式的应用程序没有本质的不同,只是MySql更显复杂一些。服务端启动网络服务进行网络监听,用户通过客户端复用网络通信来和服务端进行通信。在服务端要有一些基础的方法解释,这有些类似于编译器对源码的处理,但此处的SQL要简单很多。主要的功能框架如下图:这幅图和上篇文章的图其实是一样的,只是这里进行了一些细节的表述,更容易理解。二、主要流程主要的流程基本如下图:流程其实就是整个程序的最基本的数据和业务流动的方向,掌握了流程...原创 2021-05-16 16:51:29 · 956 阅读 · 2 评论 -
mysql源码解读——源码介绍
一、mysql介绍数据库行业,特别是关系型数据库行业,在大约二十年前左右,是相当火的,可能现在的搞计算机的体会不深,毕竟各种NoSql和分布式数据库层出不穷。想当年,有一段时间也想当个DBA去外企香一下。会写一手好的Sql语句,实现别人无法实现的功能并且速度更快更安全是面试时的基本要求。当时能接触到的数据库,老的文件型的就不提了,基本就是几家,如Oracle,DB2,赛贝思等,非常少(微软的SqlServer是后来的,当时认为他只能做中小企业开发应用)。基本上,每个行业就用一个数据库,比如当初电...原创 2021-05-04 15:59:16 · 19678 阅读 · 2 评论 -
redis源码分析之十八Lua脚本
一、Lua和Redis这篇其实和Redis本身的源码关系不是太大了,主要是看一下对REDIS的支持。Lua可能好多人都没有听说过,但是如果搞过网游的人,估计都用过,做为一种胶水语言,Lua对C/C++的支持非常友好,这是一般的脚本语言都没有做到的。它很小很轻量,所以非常容易与其它程序集成。在魔兽和仙剑等游戏中都广泛使用。Lua的缺点也很明显,对开发支持的力度不大,功能也少,功能少,就意味着如果搞复杂或者大的东西需要自己实现轮子。二、运行机制引入LUA的本质还是要提高REDIS的功能强度。...原创 2021-04-04 19:24:26 · 251 阅读 · 0 评论 -
redis源码分析之十七哨兵
一、哨兵Sentinel(哨兵),听名字大家都应该想得到这个家伙是做什么的。在redis的应用中,有单机模式、主从模式、哨兵模式和集群模式,其实你从它的发展就可以看出来,redis是从一个简单的应用开始,不断的壮大,从单点到分布式,从简单的主从备份以及初始的哨兵监控,再到可以看成把二者合成的集群模式,除了是应用场景的变化,更多的是为了提高安全性和高可用性。网上有很多人问哨兵和集群有啥不一样,其实你从REDIS的发展角度去看问题,自然就明白了这个道理。这也是后来者学习一些东西的悲哀之处,虽然直接用到...原创 2021-04-03 18:23:21 · 267 阅读 · 0 评论 -
redis源码分析之十五通知和消息订阅
一、通知在Redis中,既可以实现消息的发送又可以实现订阅,也就是常说的发布/订阅。它的主要逻辑实现在nofigy.c和module.c、pubsub.c中,其实通知做为一种辅助功能,是易用性的一种良好的接口。Redis的通知功能是一种即时在线通知功能,如果CS端断线后,相关的消息就无法再次通知,也就是说,消息机制没有保存和重发功能。这也是为了实现设计上的简单和功能实现的鲁棒性的考虑,至于以后会不会继续修改,还得看应用的需求。为了效率和开销,REDIS默认是关闭通知的,可以理解,能玩儿REDIS...原创 2021-03-14 11:34:22 · 264 阅读 · 0 评论 -
redis源码分析之十三内存DB管理
一、数据库DBREDIS是一款内存型数据库,那么数据的最终处理是如何处理的呢,前面提到了数据的挺久化,那么持久化的什么内容,其实就是数据的处理过程。也就是说,持久化的数据也就是Redis需要操作的数据,这些数据才是它真正有用的部分,前面提到的一切一切,甚至以后再提到的一切一切,其实都是为这些数据服务的,保证这些数据的安全、高效和稳定。REDIS的所有数据都存储在redisDb这个数据结构体中,它在server.h文件中,即:typedef struct redisDb { dict *dict原创 2021-02-17 18:30:36 · 247 阅读 · 0 评论 -
redis源码分析之十二数据持久化存储
一、数据持久化redis做为一种内存型数据库,做持久化,个人感觉略有鸡肋的意思。似乎有一种,别人有,自己不有也不行的感觉。以目前Redis主流的应用方式,如果仔细分析,基本上都是在内存中即可完成,对持久化没要求或者说不大。再举一个反例,如果内存中有几百G甚至更多的数据,真要是整体当机,恢复的时间基本就是灾难。目前基本应用仍然是以关系型数据库或者其它数据库(如Hadoop,Mysql等)为持久化的方式,Redis只是发挥其内存数据库的长处,诸如高速缓存、分布式锁、分布式海量数据的高并发等。但有胜于无吧,本原创 2021-01-02 15:18:29 · 355 阅读 · 1 评论 -
redis源码分析之十一内存管理
一、redis的内存管理一般来说,稍微有点规模的软件,都会自己搞一块内存管理,原因很简单,统一管理内存,适应自己的场景。其实按大牛们的话,这未必是最优选择,实在是小看了写库的那群大牛们。不过说归说,人家写也不会给你报备,想写自然就写了。Redis就听从了大牛的看法,使用了底层更好的内存分配库,根据情况使用tmalloc,jemalloc 以及glibc中的 malloc(pmalloc)。一般来说,内存管理不外乎这么几块:内存大小的管理,比如分不分页,一页多大为好。内存分配管理,怎么分配,多大...原创 2020-12-26 18:24:19 · 325 阅读 · 0 评论 -
redis源码分析之十集群之二GossIP
redis源码分析之十集群之一之二GossIP一、P2P通信传统的互联网设计,包括现在主流的互联网系统,基本是中心化的,也就是说,一切的网上活动,都需要经过一个服务中心(这是一个逻辑表述,不要和一个点,一个机器,一个机房等混淆),用户所有的动作,从理论上讲,都可以被服务端记录和控制。它和现实社会是对应的,比如去火车站买票,必须去火车站(虽然说现在不用亲自去火车站,但中心化反而更严重了)。买东西,必须去超市和菜市场,就是要打个电话,也得去电信公司办个卡。而这些,都是中心化的,只不过可能用户在办理的时候儿感原创 2020-12-20 09:39:49 · 415 阅读 · 1 评论 -
redis源码分析之十集群之一通信
一、集群再强大的系统也有当机的时候,可能是自身原因,也可能是外在原因。那么单机部署任何一个软件,都会有这种风险,而有的时候儿,这种风险是不可承受的或者说成本太高了。所以,支持分布式的部署几乎是所有大型软件的必备,Redis同样也支持,这就是集群模式。Redis的分布式集群模式不是一步而就的,一开始是简单的主从模式,一主N备,发现主设备挂掉,需要人工参与将Slaver提升到主;后来在2.8版本中,增加了哨兵模式,也就是简单化了主从的转化,但仍然没有解决主从模式中从节点下线的人工干预,也无法进行自动...原创 2020-12-05 15:19:24 · 476 阅读 · 0 评论 -
redis源码分析之九网络服务端
一、网络的整体架构在前面介绍Redis的整体流程时,初步介绍过服务端的网络代码,现在先看一下整体的架构:1、服务处理(EPoll)如果没有接触过网张编程的,特别是对LINUX上的编程模型一点都不清楚的。这块可能是个麻烦.Redis为了保证在不两同的平台的高效可行的运行,采用了在不同平台自适应使用不同的网络编程模型,这其中包括一些可能比较专用的平台,如Solaries10中的 evport,macos(FreeBSD)中的Kqueue模型。一般情况下,不论是类UNIX平台还是类LINUX平台,都...原创 2020-11-14 19:21:48 · 383 阅读 · 0 评论 -
redis源码分析之八基础的数据结构quicklist
一、quicklist再看一下quicklist,它是从Redis3.2才提供的一个数据结构。从字面意思上理解,这个应该比list快。但是同样是list,为什么它要快?就得找一下原因。在普通的list中,可以通过拥有的前向和后向指针进行前后的遍历和查找。但是,当数据量大时,这两个指针占用的空间就非常明显了。而在前面的ziplist中,可以看到,通过指示本Entry的长度配合相关标识,就可以去除这两个指针来进行遍历。但同样也要看到,这是有代价的,代价就是,在插入和删除时,空间的不断的动态变化导致的内存空间的原创 2020-10-25 10:46:44 · 144 阅读 · 0 评论 -
redis源码分析之七基础的数据结构ziplist
一、ziplist压缩列表压缩列表是HASH和跳表的小数据时的数据结构,这个在前面提到过。压缩列表的定义和使用其实在源码的头部说明中是很清楚的。看一下英文的注释:The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. It stores both strings and integer values, where integers are encoded as原创 2020-10-08 16:40:19 · 145 阅读 · 0 评论