有哪些阅读 MySQL 源码的好建议?
https://www.zhihu.com/question/20040676
有哪些阅读 MySQL 源码的好建议?
最好是关于怎么阅读(HOW)?有什么好的软件辅助?需要什么基础?一些社区,好的资料,开源项目之类的。
PS:如果你曾经阅读过,可否分享下你自己的经历,怎么计划的,时间怎么分配,有什么重要事项要注意,也可随意说下自己的心得,谢谢!
关注者
519
被浏览
57,074
关注问题写回答
邀请回答
3 条评论
分享
收起
18 个回答
默认排序
数据库领域专心吃草、挤奶和耕地的牛,技术分享网站: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
赞同 314 条评论
分享
收藏感谢
《Python Linux系统管理与自动化运维》作者
3 人赞同了该回答
《understanding mysql internal》是一个好的开始
赞同 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了)跟踪。
赞同 12添加评论
分享
收藏感谢
9 人赞同了该回答
看看这本书 Understanding MySQL Internals. http://book.douban.com/subject/1924288/
赞同 91 条评论
分享
收藏感谢
知乎用户
8 人赞同了该回答
不看
赞同 82 条评论
分享
收藏感谢
软件工程师
12 人赞同了该回答
最近正在看。进度很慢。
如果刚刚开始看开源软件, 不建议从myslq开始, 可以从一些小的项目开始。
前一阵 sphinx 收获挺大的哦, 我看的过程是。
1 是先跟踪,看看整体框架, 大体内容。
2 整体看一遍代码 ,一个一个文件的看。
3 真对难点在跟踪 ,学习。
4 对自己感觉不满意的地方,进行改进( 本人懒,一直没行动)
收获挺大的, 现在看自己以前的代码,自己都看不上了。 哈哈。
myslq 刚刚 进行的。(初步印象,mysql代码挺乱的)
我用的是win7 + vc2010 编译调试的。
mysqlops 前面的说了编译调试方式看连接 http://www.mysqlops.com/2011/12/28/win-compile-mysql55.html
我分享几点我的感受 。
- 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)
赞同 122 条评论
分享
收藏感谢收起
知乎用户
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内核方面的文章,从源码角度来看数据库如何工作的。
书的话:《数据库系统实现》 可以看看。
赞同 142 条评论
分享
收藏感谢收起
“骆驼小店”小程序电商、数据采集/爬虫,联系:[email protected]
36 人赞同了该回答
mysql 的代码又不算很好,架构也不算很好……为什么要读它的代码?先问问自己为什么要读 mysql 的代码,是想了解数据库概念吗,那应该读一本这方面的公认的好书,然后动手写一个玩具级的数据库,等你有这些经历了,再去读 mysql 代码,才能够真正地有所启发。最后也最重要的是:读代码不是高性价比的学习方法。
赞同 367 条评论
分享
收藏感谢
知乎用户
7 人赞同了该回答
可以follow这个同学,新浪微博
@何_登成
微盘有不少内容新浪微盘 | 免费网盘
赞同 7添加评论
分享
收藏感谢
知乎用户
2 人赞同了该回答
mysql官方就有介绍源码的文档,
赞同 21 条评论
分享
收藏感谢
life of databases
6 人赞同了该回答
主要看你开源码的目的了,为了定制优化mysql,开发存储引擎的话,肯定不会问怎么看mysql 源码,因为这几乎是一开始必须做的事情。
觉得现在大部分搞mysql的都希望去搞一搞源码(包括俺),或许为了了解一些问题的原因,mysql的架构,或者是‘跟风’。大牛们成天都折腾源码了,咱也要跟上脚步。极端地说,源码倍熟,而生产线运维经验欠缺,db宕机,同步失败了,难道去看看源码怎么回事?
个人觉得,源码的学习,更多是为了我们更好地使用mysql 来提供服务。
赞同 61 条评论
分享
收藏感谢
IT工程师,从事分布式系统研发。
3 人赞同了该回答
阅读mysql的代码最好有针对性,比如,你要开发一个mysql存储引擎,从这一点突破,然后就比较容易深入了。
mysql的代码是比较乱的,我是用source insight看的,效果还可以,要配合gdb调试。
这个课程或许你感兴趣
http://www.xuexichong.com/index.php?r=site/classDetail&courseId=3
赞同 31 条评论
分享
收藏感谢
2 人赞同了该回答
我是如何开始阅读MySQL源码的? - 知乎专栏
赞同 2添加评论
分享
收藏感谢
后台开发,分布式存储
2 人赞同了该回答
正在看understanding mysql internal,目前从存储引擎这块入手,正好用上
赞同 2添加评论
分享
收藏感谢
1 人赞同了该回答
我可以负责任的告诉你 mysql的代码确实设计的差了点 我刚读了一些过来 随处可见一个函数几千行 一个文件几万行 将逻辑混在一起 只不过想要理解里面的权限是怎么管理的 看完真是要吐血了
赞同 1添加评论
分享
收藏感谢
IT,oltp,olap,linux,socket,DB
去读代码一定要有目的定,你想了解哪块就去读哪块。如果 您想把代码全弄明白个人感觉需要时日。也许会有很长时间.
赞同添加评论
分享
收藏感谢
代码量十分庞大,上百万行代码,想要全部精通比较困难
而且不同的人写代码的风格也不一样。
建议针对性的阅读,大体流程了解后,针对某一块感兴趣的模块进行阅读
赞同添加评论
分享
收藏感谢
Memento Mori 三观不合,立刻拉黑
读源码的目的?
学习框架?学习算法?学习代码风格?学习技巧?