《高性能MySQL》第四版发布后,收到了很多读者的反馈,其中关注最多的是作为一个初学者,应该如何能够较为系统的学习MySQL,从而应对日常工作或者获得更好的职业发展。于是和多个业内朋友讨论后,整理了一些MySQL学习的推荐资源,供初学者参考。
本文分成几部分,包括业界专家的经验、推荐书籍、视频/音频资源、其他资源或者学习方式、MySQL学习沟通群、抽奖赠书等。

提问:刚刚入行时,有哪些资料给你了帮助?
正式接触 MySQL 是2011年底,当时的公司的数据库版本主要是 5.5 版本和少量 5.1 版本。因为之前学Oracle的经验是查看官方文档,学习MySQL 资料主要是 “官方文档” 和当时的淘宝DBA团队组织的技术大学的技术分享,学习MySQL技术的技术特性和经典案例。
其实就现在而言,MySQL 官方文档依然是最好的学习资料和教材, 里面非常详细的说明 MySQL的基础架构,redo,undo,读写逻辑,字段类型,锁,存储引擎,主从复制,MGR ,性能优化等等。把官方文档通读一遍,基本上能超越60-70%左右的DBA,为什么不是更高呢?因为学习技术是为了使用技能。
提问:进一步了解 MySQL/数据库,哪些资料给了你帮助?
换个回答的方式,哪些因素帮助我提升数据库技能水平?总结起来大概三个方面:
掌握基础知识之后,会有 “纸上来得终觉浅,绝知此事要躬行”” 的想法。基于对各种MySQL 技术知识点和 功能特性的理解,搭建单节点,主备模式环境 做各种功能测试,并且将知识点的验证或者分析过程下来写博客,比如死锁,能将常见的20个死锁常见分析过程总结下来,相信死锁问题再也难不倒你了。
如果是第一条是模拟考,那么真实的业务场景则是实战演练,在海量的业务场景下,层出不穷的业务问题和技术难点驱动 DBA 对 数据库的使用和限制了解的更多。比如:
提问:现在回头来看,哪些资料你觉得是最推荐的,分别对于初入学,和深入学习的人来说?
对于初学者而言,首要目标是 夯实基础,学好基础/理论知识。
对于深入学习的人来说, 单独的数据库学习是没有意义的,必须服务好具体的业务场景才能发挥其价值。推荐:
学习和总结各种业务场景下的数据库架构设计 ,数据库高可用,容灾,强红包,秒杀,直播弹幕等等。

对于初学者,建议自己手动安装常见的架构,比如最简单的一主一备,作为验证环境。找一些操作案例较多的博客或公众号文章,照着作者的思路执行。
然后再自己设计一些执行案例,先自己推导结果,再执行验证,在验证过程中加深理解或者勘误。
内核学习也可以延用这个方法,在验证过程中设想如果是自己实现这个功能的,会怎么写,然后通过阅读源码理解作者的设计思路。就是看源码要带着问题去看,找只要主要流程,GDB去调试单步执行。

推荐的重要学习资料包括:
深入学习:主要还是积累、排错,云数据库相关还是需要看下技术相关的论文。
MySQL作为当前最流行的关系型数据库,相关的书籍也非常多,这里罗列基本推荐如下:
MySQL相关的书籍
文档是最全面和权威的参考,而其他三本都是,根据豆瓣网友打分进行推荐的。第一本《MySQL是怎样运行的》适用于完全的初学者,内容由浅到深。第二本《高性能MySQL》则从“优化”为入口,非常系统介绍了MySQL的架构、优化,是一本非常好的进阶书籍。第三本是《MySQL技术内幕 InnoDB存储引擎》,这本书深入的介绍了MySQL核心组件InnoDB存储引擎,涵盖了数据库的事务原理、调度、物理存储、锁等知识。
另外,其实MySQL领域还有很多书籍偏重各有不同,这里不一一推荐了。
1、《MySQL是怎样运行的》
这本书于2020年出版,是一本比较新的书籍,整个书籍也是围绕其标题展开《MySQL是怎样运行的:从根儿上理解 MySQL》。这本书最大的特点是,全书有非常清晰的脉络,可以说是由“入门到精通”,书中放弃了一定的完整性(这个可以去看MySQL文档),而是非常接地气的从零开始,用了很多形象的比喻介绍MySQL数据库的各个概念。
同时,该书籍在每个章节对相关的概念也都进入了非常深入的讨论,例如,关于索引的介绍,从什么事索引、索引的物理结构开始介绍,然后,开始介绍MySQL的索引在查询、排序等场景的使用,最后,再介绍一些常见的索引优化技巧,包括普通索引、前缀索引、覆盖索引等。
总得来说,这本书是最近几年,面向于初学者非常不错的一本书。
2、《高性能MySQL》
《高性能MySQL》则从“优化”为入口,将MySQL相关的知识点聚合在一起,包括了查询性能优化(SQL优化)、高性能索引、库表结构(Schema)优化等,也包括了服务器配置(硬件和软件)优化、架构优化(包括了复制、只读节点、分片)等,还介绍了部分云服务商的MySQL等内容,是一本非常适合进阶阅读的书籍。
该书籍的作者、译者,也都是一直活跃在数据库领域第一线的数据库开发者,对于MySQL实践有着非常丰富经验。这也保障概书籍整体质量不错,不仅可以作为系统的阅读使用,也可以作为一个参考手册,可以根据自己工作需要,不定期的翻阅其中的部分章节。
3、《MySQL技术内幕 InnoDB存储引擎》
这本书则以InnoDB为切入点,非常深入的介绍了InnoDB或者说数据库的原理。InnoDB可以说是MySQL最为核心的组件,其原理不仅仅适用于MySQL,也几乎适用于大多数关系型数据库系统。
具体的,概书籍覆盖的内容包括了MySQL/InnoDB物理存储结构、索引、锁、事务等等。本书底层原理为出发点,帮助开发者理解MySQL行为、特点。
本书非常适合,对MySQL已经有一定程度了解,又希望更加深入了解其底层实现原理的人,或者是工作中需要对MySQL源码层进行修改或者定制的数据库内核开发者。
4、用好MySQL官方文档
MySQL官方文档可以说是最为权威、更新最为及时、质量也应该是最高的MySQL学习资料了。在早期,市面上还没有那么书籍的时候,我个人也是通过精读MySQL官方文档,以此为深入学习MySQL、甚至是深入学习数据库原理的知识库。
但是,官方文档为了保证完整性、准确性,会导致其看起来非常冗长、繁琐,有时候则感觉是在隔靴挠痒,偏向于介绍实现方式或原理以及MySQL提供的功能,而不会介绍读者最需要的最佳实践。例如,官方文档会详细介绍每个字段类型和参数详情,但是不会告诉你,哪些字段类型应该多用,哪些字段类型应该少用。
了解了官方文档的这些特性之后,官方文档阅读的几个要点总结如下:
总得来说,多阅读官方文档,虽然刚开始会觉得有些晦涩,坚持下来,你会发现收获巨大。
另外,阅读官方文档也要注意:也正是因为官方文档注重保障完整性、准确性,所以必定会繁琐、冗长,而不怎么介绍最佳实践经验,甚至一些主流的应用等,例如官方文档也只会将内容限定在MySQL本身,而不会包括硬件、软件或者云环境的相关的内容。
5、视频/音频资源
现在也越来越多的人通过视频的方式去在线的学习各类知识,B站上也有一些面相MySQL初学者的视频资源,质量我不太好评价,不过作为文字、书籍的补充学习,看一些视频学习还是非常不错的。大家可以去B站搜索一下“MySQL 初学者”就有很多的相关视频了,质量良莠不齐,需要大家自己甄别适合自己的。这里仅推荐一下由极客时间推出的《MySQL实战45讲》。

该系列价格也非常便宜,可以说是买不了吃亏、买不了上当,反倒是容易买到自己不能全部看完/听完的懊恼:《MySQL实战45讲》。
1、使用Google/Baidu或者ChatGPT
通常,对于某个非常具体的知识点或者行业/场景最佳实践,在文档中都不会覆盖,但是,因为MySQL的用户量极大,在互联网上也有非常多的分享和讨论,从初阶到高阶,面相各个级别的内容都有,可以说是一个大宝库,用好了也是可以事半功倍的。
2、多总结、多分享、多交流
学习本身通常都是无趣的,如果学习的知识不能够很快的在实际工作中使用,也很容易忘记。另一个非常好的学习方法,不仅仅限于学习MySQL,就是分享很总结。一方面,可以让你系统的把一个知识点了解的比较完整和透彻,也可以帮你更好的记录,大大加深理解与记忆。
3、学以致用
也许你学习MySQL的原因可能只是因为面试、解决一个工作中的问题、增长知识或者只是兴趣,无论是哪个原因促使你学习,动手练习并在工作中使用这些知识,都是非常有效的。如果,你对MySQL或者数据库很有兴趣,那么则建议在当前的公司,找一个与数据库更近的岗位工作,这样自然可以事半功倍。
4、MySQL源代码
MySQL是一个开源数据库,另一个独天得厚的资源是MySQL源代码。不过,MySQL发展的时间已经非常长了,其代码复杂度也比较高,可以考虑从一两个小的模块、小的功能点着手,去学习、验证。
5、学术论文
当如果需要了解某个具体模块的来龙去脉以及设计思想的时候,有时候去查找一些经典的数据库领域论文可以很好的帮助你解决相关的疑问。有一套大部头《Readings in Database Systems》可以作为参考或者开始,不过内容较多,需要花费大量时间,总得来说不太适合初学者。
对于不同基础的人,学习的重点和方法是各有不同的,所以本文会列举主要的MySQL数据库的学习资源和方法,读者需要结合自己的实际情况选择合适的方法。如果你有好的经验分享,可以在留言评论谈谈你的经验。
orczhou 是《高性能MySQL》的书籍的译者,同时也是来自 NineData(www.ninedata.cloud)的工程师。NineData 向企业、开发者提供高效、安全的数据库 SQL 开发、数据库备份、数据复制/迁移/集成、数据对比等功能,是一个 SaaS 服务开箱即用,可以快速提升企业 SQL 开发效率,保障企业数据安全。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解