极客时间已完结课程限时免费阅读

80 | 程序员练级攻略:数据库

80 | 程序员练级攻略:数据库-极客时间

80 | 程序员练级攻略:数据库

讲述:杨超

时长10:40大小9.75M

你好,我是陈皓,网名左耳朵耗子。
对于数据库方向,重点就是两种数据库,一种是以 SQL 为代表的关系型数据库,另一种是以非 SQL 为代表的 NoSQL 数据库。关系型数据库主要有三个:Oracle、MySQL 和 Postgres。
在这里,我们只讨论越来越主流的 MySQL 数据库。首先,我们要了解数据库的一些实现原理和内存的一些细节,然后我们要知道数据的高可用和数据复制这些比较重要的话题,了解一下关系型数据库的一些实践和难点。然后,我们会进入到 NoSQL 数据库的学习。
NoSQL 数据库千奇百怪,其主要是解决了关系型数据库中的各种问题。第一个大问题就是数据的 Schema 非常多,用关系型数据库来表示不同的 Data Schema 是非常笨拙的,所以要有不同的数据库(如时序型、键值对型、搜索型、文档型、图结构型等)。另一个大问题是,关系型数据库的 ACID 是一件很讨厌的事,这极大地影响了数据库的性能和扩展性,所以 NoSQL 在这上面做了相应的妥协以解决大规模伸缩的问题。
对于一个程序员,你可能觉得数据库的事都是 DBA 的事,然而我想告诉你你错了,这些事才真正是程序员的事。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。所以,作为一个架构师或程序员,你必须了解最重要的数据存储——数据库。

关系型数据库

今天,关系型数据库最主要的两个代表是闭源的 Oracle 和开源的 MySQL。当然,还有很多了,比如微软的 SQL Server,IBM 的 DB2 等,还有开源的 PostgreSQL。关系型数据库的世界中有好多好多产品。当然,还是 Oracle 和 MySQL 是比较主流的。所以,这里主要介绍更为开放和主流的 MySQL。
如果你要玩 Oracle,我这里只推荐一本书《Oracle Database 9i/10g/11g 编程艺术》,无论是开发人员还是 DBA,它都是必读的书。这本书的作者是 Oracle 公司的技术副总裁托马斯·凯特(Thomas Kyte),他也是世界顶级的 Oracle 专家。
这本书中深入分析了 Oracle 数据库体系结构,包括文件、内存结构以及构成 Oracle 数据库和实例的底层进程,利用具体示例讨论了一些重要的数据库主题,如锁定、并发控制、事务等。同时分析了数据库中的物理结构,如表、索引和数据类型,并介绍采用哪些技术能最优地使用这些物理结构。
学习 MySQL,首先一定是要看MySQL 官方手册
然后,官方还有几个 PPT 也要学习一下。
然后推荐《高性能 MySQL》,这本书是 MySQL 领域的经典之作,拥有广泛的影响力。不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,都能从本书中有所收获。
如果你对 MySQL 的内部原理有兴趣的话,可以看一下这本书《MySQL 技术内幕:InnoDB 存储引擎》。当然,还有官网的MySQL Internals Manual
数据库的索引设计和优化也是非常关键的,这里还有一本书《数据库的索引设计与优化》也是很不错的。虽然不是讲 MySQL 的,但是原理都是相通的。这也是上面推荐过的《高性能 MySQL》在其索引部分推荐的一本好书。
你千万不要觉得只有做数据库你才需要学习这种索引技术。不是的!在系统架构上,在分布式架构中,索引技术也是非常重要的。这本书对于索引性能进行了非常清楚的估算,不像其它书中只是模糊的描述,你一定会收获很多。
下面还有一些不错的和 MySQL 相关的文章。
最后,还有一个 MySQL 的资源列表 Awesome MySQL,这个列表中有很多的工具和开发资源,可以帮助你做很多事。
MySQL 有两个比较有名的分支,一个是 Percona,另一个是 MariaDB,其官网上的 Resources 页面中有很多不错的资源和文档,可以经常看看。 Percona ResourcesMariaDB Resources ,以及它们的开发博客中也有很多不错的文章,分别为 Percona BlogMariaDB Blog
然后是关于 MySQL 的一些相关经验型的文章。
Booking.com: Evolution of MySQL System Design ,Booking.com 的 MySQL 数据库使用的演化,其中有很多不错的经验分享,我相信也是很多公司会遇到的的问题。
Tracking the Money - Scaling Financial Reporting at Airbnb ,Airbnb 的数据库扩展的经验分享。
Why Uber Engineering Switched from Postgres to MySQL ,无意比较两个数据库谁好谁不好,推荐这篇 Uber 的长文,主要是想让你从中学习到一些经验和技术细节,这是一篇很不错的文章。
关于 MySQL 的集群复制,下面有这些文章供你学习一下,都是很不错的实践性比较强的文章。
对于 MySQL 的数据分区来说,还有下面几篇文章你可以看看。
然后,再看看各个公司做 MySQL Sharding 的一些经验分享。

NoSQL 数据库

关于 NoSQL 数据库,其最初目的就是解决大数据的问题。然而,也有人把其直接用来替换掉关系型数据库。所以在学习这个技术之前,我们需要对这个技术的一些概念和初衷有一定的了解。下面是一些推荐资料。
Martin Fowler 在 YouTube 上分享的 NoSQL 介绍 Introduction To NoSQL, 以及他参与编写的 NoSQL Distilled - NoSQL 精粹,这本书才 100 多页,是本难得的关于 NoSQL 的书,很不错,非常易读。
NoSQL Databases: a Survey and Decision Guidance,这篇文章可以带你自上而下地从 CAP 原理到开始了解 NoSQL 的种种技术,是一篇非常不错的文章。
Distribution, Data, Deployment: Software Architecture Convergence in Big Data Systems,这是卡内基·梅隆大学的一篇讲分布式大数据系统的论文。其中主要讨论了在大数据时代下的软件工程中的一些关键点,也说到了 NoSQL 数据库。
No Relation: The Mixed Blessings of Non-Relational Databases,这篇论文虽然有点年代久远。但这篇论文是 HBase 的基础,你花上一点时间来读读,就可以了解到,对各种非关系型数据存储优缺点的一个很好的比较。
NoSQL Data Modeling Techniques ,NoSQL 建模技术。这篇文章我曾经翻译在了 CoolShell 上,标题为 NoSQL 数据建模技术,供你参考。
MongoDB - Data Modeling Introduction ,虽然这是 MongoDB 的数据建模介绍,但是其很多观点可以用于其它的 NoSQL 数据库。
Firebase - Structure Your Database ,Google 的 Firebase 数据库使用 JSON 建模的一些最佳实践。
因为 CAP 原理,所以当你需要选择一个 NoSQL 数据库的时候,你应该看看这篇文档 Visual Guide to NoSQL Systems
选 SQL 还是 NoSQL,这里有两篇文章,值得你看看。

各种 NoSQL 数据库

学习使用 NoSQL 数据库其实并不是一件很难的事,只要你把官方的文档仔细地读一下,是很容易上手的,而且大多数 NoSQL 数据库都是开源的,所以,也可以通过代码自己解决问题。下面我主要给出一些典型的 NoSQL 数据库的一些经验型的文章,供你参考。
列数据库 Column Database
针对于 HBase 有两本书你可以考虑一下。
首先,先推荐两本书,一本是偏实践的《HBase 实战》,另一本是偏大而全的手册型的《HBase 权威指南》。
当然,你也可以看看官方的 The Apache HBase™ Reference Guide
另外两个列数据库:
文档数据库 Document Database - MongoDB, SimpleDB, CouchDB
数据结构数据库 Data structure Database - Redis
时序数据库 Time-Series Database
图数据库 - Graph Platform
搜索数据库 - ElasticSearch
Elasticsearch: The Definitive Guide 这是官网方的 ElasticSearch 的学习资料,基本上来说,看这个就够了。
接下来是 4 篇和性能调优相关的工程实践。
最后是 GitHub 上的资源列表 GitHub: Awesome ElasticSearch

小结

好了,总结一下今天分享的内容。虽然有人会认为数据库与程序员无关,是 DBA 的事儿。但我坚信,数据库才真正是程序员的事儿。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。
对于数据库方向,重点就是两种数据库,一种是以 SQL 为代表的关系型数据库,另一种是以非 SQL 为代表的 NoSQL 数据库。因而,在这篇文章中,我给出了 MySQL 和各种开源 NoSQL 的一些相关的有价值的文章和导读,主要是让你对这些数据库的内在有一定的了解,但又不会太深。同时给出了一些知名企业使用数据库的工程实践,这对于了解各种数据库的优劣非常有帮助,值得认真读读。
从下篇文章开始,我们将进入分布式系统架构方面的内容,里面不仅涵盖了大量的理论知识,更有丰富的入门指导和大量的工程实践。敬请期待。
下面是《程序员练级攻略》系列文章的目录。
分享给需要的人,Ta购买本课程,你将得29
生成海报并分享

赞 17

提建议

上一篇
79 | 程序员练级攻略:Java底层知识
下一篇
81 | 程序员练级攻略:分布式架构入门
unpreview
 写留言

精选留言(37)

  • 吐司是只猫
    2018-07-05
    链接的质量很高,但读者更想看耗子的理解和总结吧,希望多点描述性文字。

    作者回复: 在高手篇开篇描述中,我有如下的描述: 我假设你在前面已经打下了非常扎实的基础,但是要成为一个高手,基础知识只是一个地基,你还需要很多更为具体的技术。对我来说,就是看各种各样的文章、手册、论文、分享…… 其实,学习到一定程度,就是要从书本中走出去,到社区里和大家一起学习,而且还需要自己找食吃了。【所以,对于这里面的文章,有很多都是在罗列各种文章和资源,只是为你梳理信息源,而不是喂你吃饭】。 老实说,我已经为你梳理并过滤掉了很多的信息,这里只留下了 30% 我觉得最经济也最有价值的信息。虽然对于不同定位和不同需求的人还可以再对这些信息进行删减,但是觉得我这么一做就会对其它人不公平了。【所以,这也是我觉得最小数量集的信息和资源吧。你也可以把我这里的东西当成一个索引来对待】。

    共 2 条评论
    39
  • 无风
    2018-07-05
    这一系列看下,真的很难想象皓哥是如何做到如此广面的知识积累

    作者回复: 我至少看了3倍于这些资料的量,才给出这些东西。这主要是兴趣和坚持

    30
  • Andy
    2021-01-20
    耗子哥提供了很好的学习资源,但我觉得还是需要注意一点,不要沉溺于这些知识细节之中,把握关键点,根据自身需要去有的放矢的学习和实践,这才是最高效的学习方法,以自我的问题和需求出发,去寻找解决方案,构建自己的知识体系。切记,吾生也有涯,而知也无涯,以有涯随无涯,殆已!
    22
  • 刘強
    2018-07-07
    资料看多了,我对高手有了不同的理解。我觉得真正的高手是有自己的想法,自己的个性,独特的思维,解决问题的方式。看书再多,都理解了,都掌握了,顶多也不过是嚼别人嚼过的东西。这样的人貌似比大多数人强,其实他只不过是比别人看的多而已。有自己的思考,有自己独特的思想,有自己的输出,进而影响到别人,这才叫高手。我认为黑客才是真正的高手。这里的黑客是黑客与画家里面的定义。
    16
  • yanfan_software
    2018-07-05
    会用数据库并不代表就能设计好数据库,设计数据库与业务关联,需要了解用户需求和业务联系,这篇文章主要是介绍各个数据库的而非设计,但也没提太多底层,数据库优化,希望耗子叔可以抽空给讲讲这些。
    共 2 条评论
    14
  • 少年姜太公
    2018-07-07
    耗子叔,除了阅读书籍、博客和论文,有没有开源代码阅读经验分享。我的体会是阅读优秀开源代码就好比阅读经典文学作品,从中学习编程风格,设计思想以提高自身代码编写质量,偶尔还能把某些开源项目的代码片段、编写思路应用到自己代码中。求耗子叔分享一下阅读开源项目和提高编程水平的经验
    11
  • 1 Player
    2018-07-05
    皓叔,有些东西学习过后,一段时间不用就会忘了。怎么解决这种问题呢。
    11
  • 杨书清
    2018-07-05
    感觉对普通程序猿来说数据库的建模和设计也很重要,有这方面的资料推荐么?
    9
  • 我是曾经那个少年
    2018-07-05
    我报一下坐标,深圳南山四年Java,老师程序员练级攻略我95%都不会,是不是我太菜了!
    8
  • songyy
    2018-07-10
    我最近在读 《designing data intensive application》其中深入浅出地比较了数据库的基本算法,解决数据方面问题的模式 感觉内容很棒
    5
  • 高宇
    2018-07-06
    读者交流群申请表提交了没有回复,也不知道具体什么情况
    4
  • 杨寅冬
    2018-08-11
    大数据方面的会写一篇吗,hadoop,spark等
    2
  • Geek_217683
    2018-07-06
    耗子哥,能不能谈谈你对编辑器选择的看法,Vim,Emacs,是否还需要?
    2
  • 50infivedays
    2018-07-05
    怎么加读者群呀 我关注公众号也回复了公众号 还是不行
    2
  • zzz
    2018-07-05
    耗子叔,请教一个问题啊,go 能开发网站和写爬虫吗?我个人初步判断是,可以做网站,因为有web 框架,也可以写爬虫,因为能解析HTML 。求解~
    2
  • 一墨
    2020-06-15
    有一种I can't breathe的感觉... 不过一定要挺过来
    1
  • Geek_58e979
    2020-04-22
    这一梳理省去了好多信息干扰,留下精华的。
    1
  • Geek_85dec8
    2023-01-10 来自北京
    《MailChimp: Using Shards to Accommodate Millions of Users》 耗子叔,这个文章的超链接是不是需要更新了,点进去找不到此标题的文章😭
    1
  • 丿醉月丨飞羽觞
    2022-09-09 来自上海
    没看到有PG的内容啊
  • lemon
    2021-10-22
    少了NewSQL的介绍