1.【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)
2.MySQL 优化器源码入门-内核实现 FULL JOIN 功能
3.MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
4.Mysql数据库管理利器Xmind思维导图教你轻松学习mysqlxmind
5.MySQL源码阅读1-启动初始化
6.MySQL全文索引源码剖析之Insert语句执行过程
【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)
基于 ARM 架构,码学为避免MySQL版本变化带来的码学额外成本,本文将指导你如何从头构建MySQL 5.7.的码学Docker镜像。首先,码学我们从官方镜像的码学Dockerfile入手,但官方仅提供MySQL 8.0以上版本的码学金异开 源码资本ARM镜像,因此需要采取特殊步骤。码学 步骤一,码学使用dfimage获取MySQL 5.7.的码学原始Dockerfile,注意其原文件中通过yum安装的码学逻辑不适用于ARM,因为官方yum源缺少该版本的码学ARM rpm。所以,码学你需要:在ARM环境中安装必要的码学依赖
下载源码并安装
修改源码配置以适应ARM架构
编译源码生成rpm文件,结果存放在/root/rpmbuild/RPMS/aarch目录
构建镜像的码学Dockerfile、docker-entrypoint.sh脚本(解决Kylin V兼容性问题,码学会在后续文章详细说明)以及my.cnf文件是构建过程中的关键组件。虽然原Dockerfile需要调整以消除EOF块的报错,但整个过程需要细心处理和定制化以适应ARM平台。MySQL 优化器源码入门-内核实现 FULL JOIN 功能
本文以实现MySQL内核的FULL JOIN功能为目标,深入解析了MySQL源码的优化器工作流程。首先,作者通过环境和知识准备,明确将重点放在Server执行流程的探索上,从语法规则的修改开始,如在`sql_yacc.yy`中添加新支持,以及在`parse_tree_nodes.cc`中处理FULL JOIN的语法树解析和打印。接着,作者逐步解析了词法、语法分析后的Query_expression、Query_block和Query_term结构,并在关键函数中设置了断点以跟踪执行流程。
在探索了JOIN的优化工作流程后,作者选择在hypergraph_optimizer中实现FULL JOIN,该部分涉及RelationalExpression、JoinHypergraph的构建和AccessPath的生成。尽管过程复杂,但作者通过逐步调试和修改,成功在HashJoinIterator中添加了对FULL JOIN的支持,包括添加新数据成员和状态标记,以及在LEFT JOIN后执行ANTI JOIN流程。
在测试阶段,作者确认了FULL JOIN功能的正确性,通过在代码关键位置的筹备抬轿指标源码断点观察,确认了FULL OUTER_JOIN的出现,并展示了改造后的迭代器结构。整个过程中,作者强调了在实现过程中面临的挑战和对MySQL历史的参考,最终决定以最少改动的方式完成任务,以保持代码的简洁和性能。
通过这个项目,作者不仅深入理解了MySQL源码,还实现了FULL JOIN功能,为读者提供了一个从零开始实现新功能的实例。
MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
在探索MySQL世界的过程中,有些同学希望更深入地了解如何在Visual Studio中进行源码级调试。不用担心,让我们一步步来。必备工具
MySQL是用C++编写的,要在Windows上编译,需要几个关键工具:CMake用于生成可打开的解决方案,如MySQL.sln;Boost是强大的C++库,Bison是用于解析MySQL语法规则的工具;当然,选择适合自己版本的MySQL源码(如5.7.)也是必不可少的。详细安装步骤
安装过程需要细心,特别是Bison,务必避免默认路径中的空格问题,以免后续VS编译受阻。安装CMake和Bison时选择自定义路径,例如C:\2\GnuWin,确保它们的bin文件路径被添加到环境变量中。接下来解压mysql-5.7..zip,构建项目。编译与调试
使用CMake编译MySQL源码,当看到Build files written to: C:/2/mysql-5.7./brelease,说明成功生成.sln文件。用Visual Studio 打开MySql.Sln,耐心等待十几分钟,编译成功后即可进行下一步。启动MySQL并调试
首先,开启MySQL的调试模式,修改mysqld.cc中的test_lc_time_sz方法。然后,在Visual Studio的命令行参数中加入--console --initialize,开始调试。可能会遇到编码问题,源码安装要多久解决后,输入默认密码zJDE>IC5o+ya,连接到MySQL并修改密码。追踪write_row
在上一篇中提到的write_row是一个虚方法,通过实际调试,我们可以看到它在ha_innodb.cc的实现。设置断点,执行insert操作,可以看到代码进入ha_innodb::write_row方法,深入查看局部变量和调用堆栈,验证之前的理论。总结
通过一整天的努力,我们掌握了在Visual Studio中对MySQL源码进行调试的技巧。记住,每一步都可能是个挑战,但只有亲自动手,才能真正理解MySQL的运作机制。希望这些经验能帮助你避免一些常见的坑,祝你在源码的世界里探索得更深入!Mysql数据库管理利器Xmind思维导图教你轻松学习mysqlxmind
Mysql数据库管理利器——Xmind思维导图教你轻松学习
Mysql是现代网络应用程序必不可少的数据库管理软件。然而,对于新手来说,这个开放源代码关系型数据库管理系统可能变得有些复杂。为了帮助管理者更好地了解Mysql,我们可以使用Xmind思维导图软件。
Xmind是一款非常好用的思维导图软件,它可以帮助你更好地组织你的思路,并使学习更加系统化。下面是一个使用Xmind创建Mysql学习思维图的示例。
1.入门基础
在学习任何数据库之前,首先了解它们是如何工作的是重要的。在这里,我们可以创建一个Mysql入门基础的思维图,以帮助新手了解Mysql的工作原理。
在思维图中,我们可以列出一些Mysql的基础知识,例如:Mysql的数据类型、创建数据表、插入数据、查询数据等。这些知识点将有助于加深对Mysql的理解。
2.数据库管理
学习Mysql之后,开源通证源码我们需要了解如何管理数据库。在这个部分,我们可以创建一个数据库管理思维图,它可以帮助我们了解一些如何管理和维护数据库的方法和技巧。
在思维图中,我们可以列出一些数据库管理的重要知识点,例如:备份和恢复数据、调优和优化数据库性能、安全性和权限管理等。这些知识点可以帮助我们更好地管理我们的Mysql数据库。
3.高级技术
除了基础和数据库管理技术之外,Mysql还有很多高级技术。这些技术包括复制、分布式数据库、高可用性和灾难恢复等。在这个部分,我们可以创建一个思维图来了解这些高级技术。
在思维图中,我们可以列出Mysql的高级技术知识点,例如:复制、分区表、集群和主从复制等。这些知识点将帮助我们更好地了解如何使用Mysql进行高级数据库管理。
通过以上的思维导图学习,我们可以轻易地理解Mysql的基础、数据库管理和高级技术。这样,管理者们就可以更加高效地使用Mysql,以更好地运营他们的网络应用程序。除此之外,Xmind作为一种工具,也可以用在其它的学习和生产场景中。
MySQL源码阅读1-启动初始化
通过深入阅读MySQL源码,旨在学习并记录其内核知识。初次探索难免有错误或遗漏,欢迎指正,并期待在后续阅读中对笔记进行修正。
MySQL的启动初始化是关键步骤,涉及核心逻辑与执行流程。关注的入口函数位于`mysql-server-8.0/sql/mysqld.cc::mysqld_main`。
初始化阶段主要关注点包括启动MySQL中的线程,负责执行各种任务。源码精灵解谜活动MySQL在初始化时启动的线程种类多样,确保数据管理、查询执行与系统功能高效运作。
调用链显示了初始化过程中的函数调用关系,每个缩进代表一个函数调用,清晰地展示了初始化的执行流程。
总结而言,MySQL服务的初始化步骤复杂且关键,但通常不在日常关注范围内。初次阅读可能存在疏漏,期待在后续阅读中深入探索初始化与终止阶段的代码细节,持续优化理解。
MySQL全文索引源码剖析之Insert语句执行过程
本文来源于华为云社区,作者为GaussDB数据库,探讨了MySQL全文索引源码中Insert语句的执行过程。
全文索引是一种常用于信息检索的技术,它通过倒排索引实现,即单词和文档的映射关系,如(单词,(文档,偏移))。以创建一个表并在opening_line列上建立全文索引为例,插入'Call me Ishmael.'时,文档会被分为'call', 'me', 'ishmael'等单词,并记录在全文索引中。
全文索引Cache的作用类似于Change Buffer,用于缓存分词结果,避免频繁刷盘。Innodb使用fts_cache_t结构来管理cache,每个全文索引的表都会在内存中创建一个fts_cache_t对象。
Insert语句的执行分为三个阶段:写入行记录阶段、事务提交阶段和刷脏阶段。写入行记录阶段生成doc_id并写入Innodb的行记录,并将doc_id缓存。事务提交阶段对文档进行分词,获取{ 单词,(文档,偏移)}关联对,并插入到cache。刷脏阶段后台线程将cache刷新到磁盘。
全文索引的并发插入可能导致OOM问题,可通过修复patch #解决。当MySQL进程崩溃时,fts_init_index函数会恢复crash前的cache数据。
学习MySQL从初学者到高级开发者的必备PDF指南mysqlpdf
学习MySQL: 从初学者到高级开发者的必备PDF指南
MySQL是一种开源关系型数据库管理系统,它是Web应用程序最流行的数据库之一,用于存储和管理数据。在学习MySQL方面,有很多资源可供使用,但是难以找到一份全面的指南来帮助学习者从初学者到高级开发者的程度。本文将向您介绍一份必备的PDF指南,帮助您在MySQL的学习过程中彻底掌握它。
MySQL官方文档
MySQL官方文档是入门MySQL的的最佳选择。它非常详细地介绍了MySQL如何工作以及如何使用它的不同方面。此外,MySQL官方文档还提供了有关MySQL基本概念、语法、存储引擎、安全性、优化和监测的详细信息。
参考书目
如果你想更深入地了解MySQL的编程和管理方面,那么参考书则是比较好的选择。这里我们推荐以下两本:
《MySQL技术内幕:InnoDB存储引擎》:这是一本权威的MySQL技术内幕书籍,涵盖了很多深入的主题,例如InnoDB的存储引擎、索引、事务、锁等等。
《高性能MySQL》:这本书介绍了如何以最佳方式配置、优化和管理MySQL服务器,以确保其始终为高性能Web应用程序提供可靠且快速的数据存储服务。
在线资源
如果你想在MySQL开发方面提高自己的水平,许多在线资源都可以提供相关的支持和帮助。这里我们推荐以下三种在线资源:
1. Stack Overflow:Stack Overflow是一个知名的在线技术社区,用于解决各种编程问题。MySQL开发人员可以在这里发表问题并获得有经验的开发人员的回答。
2. MySQL官方论坛:MySQL的官方论坛提供了各种MySQL主题、问题和解答的讨论。这是一个很好的地方,可以向更具经验的MySQL开发人员请求协助。
3. GitHub:GitHub是世界上最大的软件开发社区,它提供了各种MySQL项目的源代码,这些代码可以作为学习和参考的源泉。
以上是推荐的一些学习MySQL的资源,你可以根据自己的需求和情况选择合适的资源。除此之外,我们还想介绍一些MySQL的编程基础知识,以帮助您在学习MySQL的过程中更好地理解和应用这些资源。
基础知识
1. 数据类型和列类型
MySQL支持多种不同类型的数据和列类型,例如数字、字符、日期和时间等。不同的数据类型支持的不同的列类型。
2. 数据库和表
MySQL是一个关系型数据库,包含多个数据库,每个数据库包含多个表。表存储组织好的数据,而数据库则是一组相关的表的集合。
3. SQL语句
使用SQL语句可对MySQL数据进行操作,例如查询、插入、更新和删除。以下是一些常见的SQL语句:
– SELECT:用于查询数据。
– INSERT:用于插入新数据。
– UPDATE:用于更新现有数据。
– DELETE:用于删除数据。
MySQL是一种功能丰富的数据库,可以满足许多不同的Web应用程序的要求。通过学习MySQL的基础知识和使用所述的学习资源,您可以将自己的MySQL技能从初学者水平提升到高级开发者水平,并能更好地为Web应用程序提供高效的数据管理服务。
MySQL · 源码分析 · Subquery代码分析
子查询在MySQL中的处理方式,主要涉及到其在条件/投影中的应用。它们以Item_subselect这个表达式类的子类形式存在,描述结构丰富多样。所有子查询在MySQL中以Item_subselect为基类,包含相关或非相关的类型,且具有特定的标记来描述其性质。子查询的执行方式在Subquery_strategy枚举中被明确,共有五种最终执行方式。处理流程分为prepare、optimize和execute三个阶段。在prepare阶段,子查询通过抽象语法树进行初步构建,主要完成将子查询转换为衍生表或选择性执行的逻辑。optimize阶段根据代价估算决定子查询的执行策略,包括物化执行或EXISTS方式。execute阶段,依据优化阶段确定的策略执行子查询。总结而言,子查询的处理流程在MySQL中较为复杂,特别是在prepare阶段的转换逻辑,但整体处理思路清晰。通过这种方式,MySQL能够高效地处理子查询,实现数据查询和分析的复杂需求。
MySQL 核心模块揭秘 | 期 | 创建 savepoint
回滚操作,除了回滚整个事务,还可以部分回滚。部分回滚,需要保存点(savepoint)的协助。本文我们先看看保存点里面都有什么。
作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源
本文基于 MySQL 8.0. 源码,存储引擎为 InnoDB。
InnoDB 的事务对象有一个名为undo_no 的属性。事务每次改变(插入、更新、删除)某个表的一条记录,都会产生一条 undo 日志。这条 undo 日志中会存储它自己的序号。这个序号就来源于事务对象的 undo_no 属性。
也就是说,事务对象的 undo_no 属性中保存着事务改变(插入、更新、删除)某个表中下一条记录产生的 undo 日志的序号。
每个事务都维护着各自独立的 undo 日志序号,和其它事务无关。
每个事务的 undo 日志序号都从 0 开始。事务产生的第 1 条 undo 日志的序号为 0,第 2 条 undo 日志的序号为 1,依此类推。
InnoDB 的 savepoint 结构中会保存创建 savepoint 时事务对象的 undo_no 属性值。
我们通过 SQL 语句创建一个 savepoint 时,server 层、binlog、InnoDB 会各自创建用于保存 savepoint 信息的结构。
server 层的 savepoint 结构是一个SAVEPOINT 类型的对象,主要属性如下:
binlog 的 savepoint 结构很简单,是一个 8 字节的整数。这个整数的值,是创建 savepoint 时事务已经产生的 binlog 日志的字节数,也是接下来新产生的 binlog 日志写入 trx_cache 的 offset。
为了方便介绍,我们把这个整数值称为binlog offset。
InnoDB 的 savepoint 结构是一个trx_named_savept_t 类型的对象,主要属性如下:
创建 savepoint 时,server 层会分配一块 字节的内存,除了存放它自己的 SAVEPOINT 对象,还会存放 binlog offset 和 InnoDB 的 trx_named_savept_t 对象。
server 层的 SAVEPOINT 对象占用这块内存的前 字节,InnoDB 的 trx_named_savept_t 对象占用中间的 字节,binlog offset 占用最后的 8 字节。
客户端连接到 MySQL 之后,MySQL 会分配一个专门用于该连接的用户线程。
用户线程中有一个m_savepoints 链表,用户创建的多个 savepoint 通过 prev 属性形成链表,m_savepoints 就指向最新创建的 savepoint。
server 层创建 savepoint 之前,会按照创建时间从新到老,逐个查看链表中是否存在和本次创建的 savepoint 同名的 savepoint。
如果在用户线程的 m_savepoints 链表中找到了和本次创建的 savepoint 同名的 savepoint,需要先删除 m_savepoints 链表中的同名 savepoint。
找到的同名 savepoint,是 server 层的SAVEPOINT 对象,它后面的内存区域分别保存着 InnoDB 的 trx_named_savept_t 对象、binlog offset。
binlog 是个老实孩子,乖乖的把 binlog offset 写入了 server 层为它分配的内存里。删除同名 savepoint 时,不需要单独处理 binlog offset。
InnoDB 就不老实了,虽然 server 层也为 InnoDB 的 trx_named_savept_t 对象分配了内存,但是 InnoDB 并没有往里面写入内容。
事务执行过程中,用户每次创建一个 savepoint,InnoDB 都会创建一个对应的 trx_named_savept_t 对象,并加入 InnoDB 事务对象的 trx_savepoints 链表的末尾。
因为 InnoDB 自己维护了一个存放 savepoint 结构的链表,server 层删除同名 savepoint 时,InnoDB 需要找到这个链表中对应的 savepoint 结构并删除,流程如下:
InnoDB 从事务对象的 trx_savepoints 链表中删除 trx_named_savept_t 对象之后,server 层接着从用户线程的 m_savepoints 链表中删除 server 层的SAVEPOINT 对象,也就连带着清理了 binlog offset。
处理完查找、删除同名 savepoint 之后,server 层就正式开始创建 savepoint 了,这个过程分为 3 步。
第 1 步,binlog 会生成一个 Query_log_event。
以创建名为test_savept 的 savepoint 为例,这个 event 的内容如下:
binlog event 写入 trx_cache 之后,binlog offset 会写入 server 层为它分配的 8 字节的内存中。
第 2 步,InnoDB 创建 trx_named_savept_t 对象,并放入事务对象的 trx_savepoints 链表的末尾。
trx_named_savept_t 对象的 name 属性值是 InnoDB 的 savepoint 名字。这个名字是根据 server 层为 InnoDB 的 trx_named_savept_t 对象分配的内存的地址计算得到的。
trx_named_savept_t 对象的savept 属性,是一个 trx_savept_t 类型的对象。这个对象里保存着创建 savepoint 时,事务对象中 undo_no 属性的值,也就是下一条 undo 日志的序号。
第 3 步,把 server 层的 SAVEPOINT 对象加入用户线程的 m_savepoints 链表的尾部。
server 层会创建一个SAVEPOINT 对象,用于存放 savepoint 信息。
binlog 会把binlog offset 写入 server 层为它分配的一块 8 字节的内存里。
InnoDB 会维护自己的 savepoint 链表,里面保存着trx_named_savept_t 对象。
如果 m_savepoints 链表中存在和本次创建的 savepoint 同名的 savepoint, 创建新的 savepoint 之前,server 层会从链表中删除这个同名的 savepoint。
server 层创建的 SAVEPOINT 对象会放入m_savepoints 链表的末尾。
InnoDB 创建的 trx_named_savept_t 对象会放入事务对象的trx_savepoints 链表的末尾。