有哪些阅读 MySQL 源码的好建议?

https://www.zhihu.com/question/20040676

 

有哪些阅读 MySQL 源码的好建议?

最好是关于怎么阅读(HOW)?有什么好的软件辅助?需要什么基础?一些社区,好的资料,开源项目之类的。

PS:如果你曾经阅读过,可否分享下你自己的经历,怎么计划的,时间怎么分配,有什么重要事项要注意,也可随意说下自己的心得,谢谢!

关注者

519

被浏览

57,074

关注问题写回答

​邀请回答

​3 条评论

​分享

收起

18 个回答

默认排序​

mysqlops

mysqlops

数据库领域专心吃草、挤奶和耕地的牛,技术分享网站:www.mysqlops.com

31 人赞同了该回答

前言:很久没看源码了,也看不动了

个人感受:

记得08年的时候特别悠闲,为此每天干完活,先是看过几遍手册,后读源代码,想理清楚内部关系,看了几个月还是特难理清楚,以及过了一段时间之后很快又忘记

后来,我不去理清楚所有的东西,而是为理清楚某个细节而去阅读,比如查询优化器 如何实现的,就专看这块的代码,效果要好一些;

再后来,ITPUB上发现一些网友碰到的问题,知道如何帮助他们解决,也不是特别清楚为何出现,就以此为目标去源码中寻求解答

现在感受:

真的看不懂源码了,C++都忘记光了,时间与精力也不如以前,而更多是鼓励他人去源码,但是建议大家用Windows机器安装VS2008的方式,这样方便调试源码,以及观察源码中变量值,推荐一篇文章:
文章标题: win7下编译MySQL5.5的详细步骤
文章地址: http://www.mysqlops.com/2011/12/28/win-compile-mysql55.html

另外参考这样核心的主题方式解读源码,主题:MariaDB数据库5.5.27 HASH JOIN源码解读
文章地址:http://www.mysqlops.com/2012/10/18/mariadb-5-5-27-hash-join%E6%BA%90%E7%A0%81%E8%A7%A3%E8%AF%BB.html

编辑于 2012-10-19

​赞同 31​​4 条评论

​分享

​收藏​感谢

赖明星

赖明星

《Python Linux系统管理与自动化运维》作者

3 人赞同了该回答

《understanding mysql internal》是一个好的开始

编辑于 2017-01-26

​赞同 3​​添加评论

​分享

​收藏​感谢

昶文

昶文

12 人赞同了该回答

没看过MySQL,但是看过PostgreSQL,说一点经历吧。
首先,一定要对SQL语法语义熟练。比如除了select,update,insert,delete,create以外,还要熟悉with 语句的语义与使用场景,各种join的语义,view与table的区别与联系,等等。因为源码里有些变量名字是缩写,不懂语义是完全记不清的。这一条很重要,但学习方法也很简单,找本书敲例子就行,或者跟踪官网例子敲一遍。
其次,要有架构感。一,如果不存在并发,一条SQL语句,是如何经历语法解析,语义检测,语义优化后得到怎样的执行树,然后执行树是怎样执行,如何存取文件(文件格式,行数据如何解析等);二,再考虑是如何实现并发执行时候的ACID。把并发单独抽取出来好处是不容易被绕晕头。
还有,要带着目标去研究。不要为了学习而看开源代码,看源码是很枯燥的事情,特别是C/CPP写的开源软件都带了很多底层实现细节,很容易就绕进去暗无天日。可以带着独立的问题去研究,比如数据是怎么在磁盘存储的,存储格式是怎样,怎样解析一条记录;比如SQL是解析成什么样的语法树节点,语法树又是如何进行语义检测,语义检测之后都做了什么语义优化;执行树是如何表示的,怎样执行的;ACID是怎样实现的,都提供了几种隔离级别,版本控制在内存或者磁盘数据上是如何表示以及实现的,redo,undo是怎样实现的,是怎样利用日志来完成持久性以及数据恢复的等等。
再补充一点吧,要是有源码分析的书籍,可以先看一遍,挑一个论题深入看透,然后看源码做笔记,再使用debug工具(最好是可视化IDE,gdb 很容易就搞得屏幕花脸,虽然我习惯gdb了)跟踪。

发布于 2016-11-15

​赞同 12​​添加评论

​分享

​收藏​感谢

哼哈二匠

哼哈二匠

9 人赞同了该回答

看看这本书 Understanding MySQL Internals. http://book.douban.com/subject/1924288/

发布于 2012-04-14

​赞同 9​​1 条评论

​分享

​收藏​感谢知乎用户

知乎用户

8 人赞同了该回答

不看

编辑于 2017-12-22

​赞同 8​​2 条评论

​分享

​收藏​感谢

王信

王信

软件工程师

12 人赞同了该回答

最近正在看。进度很慢。

如果刚刚开始看开源软件, 不建议从myslq开始, 可以从一些小的项目开始。

前一阵 sphinx 收获挺大的哦, 我看的过程是。
1 是先跟踪,看看整体框架, 大体内容。
2 整体看一遍代码 ,一个一个文件的看。
3 真对难点在跟踪 ,学习。
4 对自己感觉不满意的地方,进行改进( 本人懒,一直没行动)
收获挺大的, 现在看自己以前的代码,自己都看不上了。 哈哈。

myslq 刚刚 进行的。(初步印象,mysql代码挺乱的)
我用的是win7 + vc2010 编译调试的。
mysqlops 前面的说了编译调试方式看连接 http://www.mysqlops.com/2011/12/28/win-compile-mysql55.html

我分享几点我的感受 。

  1. mysql 不用配置文件也可以启动 ,我用命令参数指定数据路径和端口 
    --datadir="D:/work/bin/MySQL5/sql/datatt" --port=39000

2 代码量很大, 别一开始就太纠缠细节。不然打击会很大。

3 多去网上找点资料,这样自己看时会事半功倍。

4 给你个堆栈电梯 , 直接到 接口层(ha_innobase) , 我也刚刚到这。
> mysqld.exe!row_sel_store_mysql_rec
mysqld.exe!row_search_for_mysq
mysqld.exe!ha_innobase::index_read
mysqld.exe!ha_innobase::index_first(unsigned char * buf) 
mysqld.exe!handler::read_range_firs
mysqld.exe!handler::read_multi_range_first
mysqld.exe!QUICK_RANGE_SELECT::get_next() 
mysqld.exe!rr_quick(READ_RECORD * info) 
mysqld.exe!join_init_read_record(st_join_table * tab) 
mysqld.exe!sub_select(JOIN * join, st_join_table * join_tab, bool end_of_records) 
mysqld.exe!do_select(JOIN * join, List<Item> * fields, TABLE * table, Procedure * procedure)
mysqld.exe!JOIN::exec() 
mysqld.exe!mysql_select
mysqld.exe!handle_select(THD * thd, LEX * lex, select_result * result, unsigned long setup_tables_done_option) 
mysqld.exe!execute_sqlcom_select(THD * thd, TABLE_LIST * all_tables) 
mysqld.exe!mysql_execute_command(THD * thd) 
mysqld.exe!mysql_parse(THD * thd, char * rawbuf, unsigned int length, Parser_state * parser_state) 
mysqld.exe!dispatch_command
mysqld.exe!do_command(THD * thd) 
mysqld.exe!do_handle_one_connection(THD * thd_arg) 
mysqld.exe!handle_one_connection(void * arg)

编辑于 2012-04-17

​赞同 12​​2 条评论

​分享

​收藏​感谢收起​知乎用户

知乎用户

14 人赞同了该回答

MYSQL 可能后面会尝试读一下,我现在主要是读postgresql代码,我强答一下看pg代码的方法吧,应该跟mysql估计差不多,希望对你有帮助。

工具:
1、阅读代码工具eclipse,source insight(win),vim
2、调试,GDB或者CGDB(推荐)

刚开始,可以拿到一个source包,解压,可以先看看代码的层级关系,不同的包主要功能是干什么的 例如下图:

 

 

先看看代码的包,pg最主要的是backend,这个里面会包含数据库所有的内容,新手的话,如果没头绪,可以从最基础的开始看。例如一个SQL是如何被执行的:这就需要拆解好几步了,如果是做过数据库的都知道,一个SQL需要做解析,解析完成后,重写再生产查询树,根据查询树,得到执行计划,然后数据库执行你生成的执行计划。

例子SQL:select * from t1;
1、SQL解析,这块pg用的是flex&bison,这块主要是词义+语义解析,生成对应的结构体。
还算是比较复杂的一个东西,所有SQL语法都需要从这个里面解析,pg的话可以看看gram.y&scan.l这2个文件。这块解析完成后,会返回一个List回来对应的就是完整的SQL结构SelectStmt

可以看到targetList = 0x1beb0a0, fromClause = 0x1beb158只有这2个有值,
例如我想看看fromClause这个值,其实这个一看就知道是SQL的from的表名称,我们看看是什么东东。

relname就是我们的表名称。
如果想看解析的部分,flex&bison还是比较复杂的,新手可以没必要去更进去看。

 

2、我们已经把一条SQL解析成一个SelectStmt的结构体,而且只有2部分,target list跟from Clause。这就是对应的SQL中的 *跟 t1。第二步就是根据parse tree rewrite生成query tree。

这是重写后的结构体Query。里面比SelectStmt增加了不少东西。这个里面可以跟的很深,看看里面到底是基于什么来进行重写的。

 

3、这块就到了生成执行计划了,这个是数据库中最重要的部分了,因为你的SQL执行的快慢,都是它说的算。

这个里面需要注意的就是哪个plantree。这个里面就博大精深了,如果写博客,估计能写一个系列出来。不过如果是刚开始只需要知道是这个里面生成执行计划就OK拉。

 

4、计划生成了,如何执行?

都在这个里面。那这个里面的代码就复杂了,MySQL估计也一样复杂的不要不要的。
因为代码太多,需要记住很多,最好拿个本子,大的黑板更好。

 

因为里面太多递归了,至少跟到这就知道一个SQL是如何执行的,我这只是泛泛的写一下步骤,具体这个里面每个东西都相当有含金量,并且每个东西都够你学习很久。flex&bison这个东西在解析SQL的时候 就特别复杂,前段时间我尝试自己写个SQL解析器,也就只能写个简单的。执行计划那块,就更复杂了,如果你想刨根问底,记住拿本子记住执行的路径,而且中间夹着了太多的判断,让你头晕的不行。

如果知道了这些,那么就需要去了解什么是数据,一条record是怎么存储的,Tuple有哪些属性,包括内存的上下文方面,一个表是如何表示的,这些都很复杂,而且头文件太多,其实我现在看东西,先去看看对应的头文件,然后稍微记一下对应的头文件结构体已经对应的API,就知道这个东西他提供哪些操作。

包括我上面的SQL,如果加个where条件,数据是如何过滤的,表的扫描方式,它在代码里面是如何来操作的,这些方方面面,一点点的跟代码,就知道数据库是如何工作的。基于国内很多大公司,做内核方面的开发,会在这上面做些优化和新功能开发,其实都很不错的。

书这方面,其实内核方面的书市面上真的比较少,基于源码层面的更少, 如果有精力,自己一点点的开始跟,还是能收获很多的知识。

这上面只是稍微介绍了一点点关于如何来学习数据库源码的方法,我相信MySQL也可以这样进行源码学习的。并且从实际运用中进行总结归纳,收获一定会很多

我最近也有打算写一些关于PG内核方面的文章,从源码角度来看数据库如何工作的。
书的话:《数据库系统实现》 可以看看。

发布于 2016-09-09

​赞同 14​​2 条评论

​分享

​收藏​感谢收起​

赖勇浩

赖勇浩

“骆驼小店”小程序电商、数据采集/爬虫,联系:biz@gzqichang.com

36 人赞同了该回答

mysql 的代码又不算很好,架构也不算很好……为什么要读它的代码?先问问自己为什么要读 mysql 的代码,是想了解数据库概念吗,那应该读一本这方面的公认的好书,然后动手写一个玩具级的数据库,等你有这些经历了,再去读 mysql 代码,才能够真正地有所启发。最后也最重要的是:读代码不是高性价比的学习方法。

发布于 2012-03-07

​赞同 36​​7 条评论

​分享

​收藏​感谢知乎用户

知乎用户

7 人赞同了该回答

可以follow这个同学,新浪微博
@何_登成
微盘有不少内容新浪微盘 | 免费网盘

发布于 2013-04-14

​赞同 7​​添加评论

​分享

​收藏​感谢知乎用户

知乎用户

2 人赞同了该回答

mysql官方就有介绍源码的文档,

MySQL Documentation

编辑于 2017-03-31

​赞同 2​​1 条评论

​分享

​收藏​感谢

devilkin

devilkin

life of databases

6 人赞同了该回答

主要看你开源码的目的了,为了定制优化mysql,开发存储引擎的话,肯定不会问怎么看mysql 源码,因为这几乎是一开始必须做的事情。
觉得现在大部分搞mysql的都希望去搞一搞源码(包括俺),或许为了了解一些问题的原因,mysql的架构,或者是‘跟风’。大牛们成天都折腾源码了,咱也要跟上脚步。极端地说,源码倍熟,而生产线运维经验欠缺,db宕机,同步失败了,难道去看看源码怎么回事?
个人觉得,源码的学习,更多是为了我们更好地使用mysql 来提供服务。

发布于 2012-11-19

​赞同 6​​1 条评论

​分享

​收藏​感谢

谢立超

谢立超

IT工程师,从事分布式系统研发。

3 人赞同了该回答

阅读mysql的代码最好有针对性,比如,你要开发一个mysql存储引擎,从这一点突破,然后就比较容易深入了。
mysql的代码是比较乱的,我是用source insight看的,效果还可以,要配合gdb调试。
这个课程或许你感兴趣
http://www.xuexichong.com/index.php?r=site/classDetail&courseId=3

发布于 2012-01-31

​赞同 3​​1 条评论

​分享

​收藏​感谢

何广宇

何广宇

2 人赞同了该回答

我是如何开始阅读MySQL源码的? - 知乎专栏

发布于 2017-03-31

​赞同 2​​添加评论

​分享

​收藏​感谢

韩占校

韩占校

后台开发,分布式存储

2 人赞同了该回答

正在看understanding mysql internal,目前从存储引擎这块入手,正好用上

发布于 2014-02-08

​赞同 2​​添加评论

​分享

​收藏​感谢

爱迪生

爱迪生

1 人赞同了该回答

我可以负责任的告诉你 mysql的代码确实设计的差了点 我刚读了一些过来 随处可见一个函数几千行 一个文件几万行 将逻辑混在一起 只不过想要理解里面的权限是怎么管理的 看完真是要吐血了

发布于 2016-01-29

​赞同 1​​添加评论

​分享

​收藏​感谢

James

James

IT,oltp,olap,linux,socket,DB

去读代码一定要有目的定,你想了解哪块就去读哪块。如果 您想把代码全弄明白个人感觉需要时日。也许会有很长时间.

发布于 2012-03-07

​赞同​​添加评论

​分享

​收藏​感谢

slwang

slwang

代码量十分庞大,上百万行代码,想要全部精通比较困难
而且不同的人写代码的风格也不一样。
建议针对性的阅读,大体流程了解后,针对某一块感兴趣的模块进行阅读

发布于 2016-06-22

​赞同​​添加评论

​分享

​收藏​感谢

杨天

杨天

Memento Mori 三观不合,立刻拉黑

读源码的目的?
学习框架?学习算法?学习代码风格?学习技巧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值