![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
MySQL源码分析
文章平均质量分 84
源码
拾牙慧者
会点c++、python;
展开
-
《DBNotes:Join算法的前世今生》
目录NestLoopJoin算法Simple Nested-Loop JoinIndex Nested-Loop JoinBlock Nested-Loop JoinBatched Key AccessHash Join算法In-Memory Join(CHJ)On-Disk Hash Join参考链接在8.0.18之前,MySQL只支持NestLoopJoin算法,最简单的就是Simple NestLoop Join,MySQL针对这个算法做了若干优化,实现了Block NestLoop Join,.原创 2021-05-04 14:10:58 · 318 阅读 · 1 评论 -
《DBNotes: Buffer Pool对于缓冲页的链表式管理》
目录Buffer Pool回顾Buffer Pool内部组成freelistflushlistLRU链表管理以及改进Buffer Pool回顾我们知道针对数据库的增删改删操作都是在Buffer Pool中完成的,一条sql的执行步骤可以认为是这样的:1、innodb存储引擎首先在缓冲池中查询有没有对应的数据,有就直接返回2、如果不存在,则去磁盘进行加载,并加入缓冲池3、同时该记录会被加上独占锁,防止多人修改,出现数据不一致而且我们知道,可以通过设置my.cnf配置中的innodb_buf.原创 2021-04-29 12:17:20 · 240 阅读 · 0 评论 -
《单线程的build hash table、write rows to chunks、hash join的步骤以及流程图》
Build Hash Table流程1、初始化row buffer2、从build input table中读一行3、若读完build input table所有row,返回状态READING_ROW_FROM_PROBE_item4、否则,向hash map中写入一条row5、如果hash map 写入成功,返回2,继续执行6、若hash map满了,则写chunk file1、初始化chunk file2、将剩余的row写入chunk file3、返回状态READING_ROW_F原创 2021-06-14 23:49:32 · 298 阅读 · 1 评论 -
MySQL 8.0.22执行器源码分析HashJoin —— 一些初始化函数的细节步骤
目录InitRowBuffer(101行~126行)InitProbeIterator(142行~153行)*HashJoinIterator* 的Init(155行~240行)InitializeChunkFiles(364行~401行)让我们接着上一篇分析BuildHashTable函数细节步骤继续吧,这些函数都在hash_join_iterator.cc文件中。InitRowBuffer(101行~126行)需要注意的两个步骤1、初始化row buffer,使用到一个seed。具体哈希计算.原创 2021-06-04 16:27:03 · 379 阅读 · 0 评论 -
MySQL 8.0.22执行器源码分析HashJoin —— BuildHashTable函数细节步骤
BuildHashTable函数细节步骤该函数位置处于hash_join_iterator.cc 403 ~ 560行step1:如果被驱动表迭代器没有更多的行数,更新m_state为EOR,然后返回false,表明创建hash表失败if (!m_build_iterator_has_more_rows) { m_state = State::END_OF_ROWS; return false;}**step2:**还原插入行缓冲区的最后一行。如果构建输入是一个嵌套循环,内部有一原创 2021-06-02 17:18:43 · 418 阅读 · 0 评论 -
《MySQL8.0.22:Lock(锁)知识总结以及源码分析》
事务加锁方式:两阶段锁:整个事务分为两个阶段,前一个阶段加锁,后一个阶段为解锁。在加锁阶段,事务只能加锁,也可以操作数据,但是不能解锁,直到事务释放第一个锁,就进入了解锁阶段,此阶段事务只能解锁,也可以操作数据,不能再加锁。两阶段协议使得事务具有比较高的并发度,因为解锁不必发生在事务结尾。不过它没有解决死锁问题,因为它在加锁阶段没有顺序要求,如果两个事务分别申请了A,B锁,接着又申请对方的锁,此时进入死锁状态。Innodb事务隔离在MVCC并发控制中,读操作可以分为两类:快照读和当前读。快照读原创 2021-05-16 16:43:14 · 1305 阅读 · 3 评论 -
《DBNotes:Buffer Pool刷脏页细节以及改进》
本笔记知识沿用之前DBNotes: Buffer Pool对于缓冲页的链表式管理的部分知识目录获取一个空闲页的源码逻辑Page_Cleaner_ThreadLRU_Manager_ThreadHazard Pointer作为驱逐算法改进参考获取一个空闲页的源码逻辑任何一个读写请求都需要从Buffer pool来获取所需页面。如果需要的页面已经存在于Buffer pool,那么直接利用当前页面进行操作就行。但是如果所需页面不在Buffer pool,比如UPDATE操作,那么就需要从Buffer p原创 2021-05-06 18:51:30 · 523 阅读 · 0 评论 -
《源码分析转载收藏向—数据库内核月报》
月报原地址:数据库内核月报现在记录一下,我可能需要参考的几篇文章吧,不然以后还得找:MySQL · 代码阅读 · MYSQL开源软件源码阅读小技巧MySQL · 源码分析 · 聚合函数(Aggregate Function)的实现过程MySQL · 新特征 · MySQL 哈希连接实现介绍MySQL · 源码分析 · 子查询优化源码分析MySQL · 源码阅读 · 创建二级索引MySQL · 源码分析 · Innodb缓冲池刷脏的多线程实现MySQL · 源码阅读 · InnoDB伙伴内存原创 2021-04-29 15:08:18 · 290 阅读 · 0 评论 -
《MySQL 8.0.22执行器源码分析(4.1)Item_sum类以及聚合》
Item_sum类用于SQL聚合函数的特殊表达式基类。这些表达式是在聚合函数(sum、max)等帮助下形成的。item_sum类也是window函数的基类。聚合函数限制不能在表达式的所有位置使用聚合函数,使用聚合函数应该有一些明确的限制。在没有嵌套的查询中,select列表的表达式中,having自居中使用聚合函数是有效的,在where子句、form子句或group by子句则是无效的。关于解释,这篇文章可以看看:https://blog.csdn.net/weixin_33725515/arti原创 2021-04-19 21:25:31 · 582 阅读 · 0 评论 -
《MySQL 8.0.22执行器源码分析(3.2)关于HashJoinIterator》
关于连接该迭代器用于使用哈希匹配输入的rows。该迭代器的所有操作在内存中执行,内部连接算法如下:1、两个输入:一个probe,一个build。总大小最小的输入当做bulid输入。我认为其实就是驱动表和被驱动表。在之前的文章中有详细的区分过程:https://blog.csdn.net/qq_42604176/article/details/115495328?spm=1001.2014.3001.55012、将build输入中的所有行读取到内存哈希表中。哈希表中使用的哈希key是根据join的属性计原创 2021-04-18 20:55:12 · 496 阅读 · 0 评论 -
《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》
目录RowIteratorInit()Read()SetNullRowFlag()UnlockRow()StartPSIBatchMode()EndPSIBatchModeIfStarted()real_iterator()RowIterator使用选定的访问方法读取单个表的上下文:索引读取,扫描等,缓存的使用等。它主要是用作接口,但也包含一些私有成员函数,这些函数对于许多实现都是有用的,例如错误处理。RowIterator是一个简单的迭代器。您对其进行初始化,然后一次读取一个记录,直到Read(原创 2021-04-16 20:37:30 · 493 阅读 · 0 评论 -
《MySQL 8.0.22执行器源码分析(2)解读函数 ExecuteIteratorQuery》
函数代码bool SELECT_LEX_UNIT::ExecuteIteratorQuery(THD *thd) { THD_STAGE_INFO(thd, stage_executing); DEBUG_SYNC(thd, "before_join_exec"); Opt_trace_context *const trace = &thd->opt_trace; Opt_trace_object trace_wrapper(trace); Opt_trace_obje原创 2021-04-16 17:37:52 · 607 阅读 · 0 评论 -
《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》
未完成的函数调用栈顺序记录了函数语句从服务器main函数到执行器之前的一些具体调用,5.几版本到8.0.22版本,这里的调用顺序并没有多大变化注意这里是接着上面的2、,同属mysql_parse()按照网上代码版本接下来的调用顺序应该是这样的:这里的JOIN::exec() 和do_select我没有在代码中找到,就直接跳过这两个函数吧。8.0使用迭代器模式改进executor在文章https://cloud.tencent.com/developer/article/1461353中说道:原创 2021-04-14 12:14:06 · 973 阅读 · 0 评论