SQL 数据库学习路线推荐

2,526 阅读6分钟

昨天我们的星球里有位朋友咨询了个 SQL 数据库学习路线的问题。

一开始学数据库的时候,和学校里教的 C/C++/Java 完全不是一个路子的事。你学会了 C 中的函数,Java 中的方法,却无法理解 SELECT WHERE FROM 到底为什么不能执行;你知道了指针,却依旧不知道为什么需要一个索引才能使得 SQL 跑的飞快。

其实入门来说,把书好好看看,例子好好做做,就会了。

从入门到能做事,才是需要花时间精进的。

以下是我在知乎上答的 一篇帖子,顺着其中提到的书,慢慢摸索个年把,就会略有小成了。

数据库的内部结构,就像是操作系统那么复杂。

它涉及到的内容,有硬件三大件,即 CPU, 内存,IO;还有与之交互的软件,SQL 和 内嵌的语言( 比如 CLR )

远古时期的数据库应用,只有少数科学家在上面跑批处理,瓶颈往往都是单个硬件组件,比如 CPU, 内存,IO. 大家都知道的是老式的硬盘,往往转速不够快,导致计算一直很缓慢,那么用 RAID 就可以明显提高效率了;内存在早期也没有很多的容量,或者价格很高,很难民用;CPU 往往是发展最快的,摩尔定理 18 个月翻番,但在那时候,依旧达不到现在 i3 的速度。

所以就在那个时期,跑批花的时间可能是几天。有部电影《模仿游戏》,由图灵艾伦(就是美国计算机协会以他的名义设立了图灵奖的那个图灵》自制的破译德军密码的机器,在破译之前大家能做的事情就是等着机器停下来。20世纪50年代,计算机被正式用起来的那段时期,数据管理概念(现在被称为数据库管理)已经成型了。那个年代基本上在硬件体系找性能优化突破口。

上述的故事,历史告诉我们一个契机:在谈论数据库性能优化的时候,不可忽略机器,软件本身的架构。在我们谈论如何优化 SQL 的时候,能一定不能脱离数据库软件自身的体系结构。那么以下的书单,是需要同时进行阅读与操练的。

以我目前所使用的 SQL Server 来说,这些书可以按个看下去:

涉及到体系结构的,分别有《Microsoft SQL Server 2008 Internals》,《Inside SQL Server 2005/2008 Storage Engine》.

《Storage Engine》,切勿望文生义,不单讲存储,它是全面的让我们了解 SQL Server 底层结构与上层应用的本质。书中的一张体系图,非常好用。你之前用 Sql Server Management Studio 来拉一拉数据,还经常抱怨下,这界面怎么老是运行的那么慢,一会就卡死。看过之后,你就会觉得,哦,原来这些 SQL 还要经过这这这那那那步骤,难怪反应慢了,看来我得限制点数据跑一跑,或者去服务器用Bulk 跑一下。你看是不是对调优也有帮助呢。本书除了讲体系,更重要的是帮我们了解一些表,索引结构的知识。有些做了很久开发的朋友,其实是不知道为什么要分区,怎样分区的。所以在这里可以看到,分区的概念就是分布式存储的一个应用,利用多磁盘的轨道寻址,帮助 SQL 查找数据。

《Internals》是讲内幕的书。你看了之前的《Storage Engine》能够帮你了解是什么,那么这本书就带你了解为什么要这么做。为什么 Halloween Problem 会存在,即导致你的 SQL 循环,明明有了退出条件,为什么始终等不到退出; 为什么 SQL 有了 where 条件,却把别人的查询给堵塞了;为什么 Inner join 没有 Inner Hash Join 来得快,等等一系列问题,都会在书中有详细例子给你做阐述。除了这些针对 SQL 本身的原理提出了解释,本书还有很多实质性操作的案例。就比如 Inner Hash Join 。 我经常会问身边做了4,5年开发的朋友,平时用什么 Hint 来提高性能。他们很多时候给我的 答案是,摇头,即不知道 Hint 是什么。那么 “ with(NOLOCK) 用过吗 ”,“当然,这样可以允许读的快一点”。 所以假如你也不知道内幕是什么,看这本书就对了。

如果想要再深入一点,可以看看《Windows Internals》。这是一本讲 Windows 操作系统的书。讲进程,线程,内存,NUMA, Performance Monitor, 在我们对数据库做日常健康巡检的时候,经常会用到的一些概念。

《Inside Microsoft SQL Server Queryting Tuning and Optimization》:如果大家平时的工作,就是为了拉数据快一点,而不想深入的去了解体系,就想在 3 个月内提高自己的 T-SQL 优化水平,那么直接看这本吧。本书从实际的调优的角度出发,带我们寻找,为什么我们的 SQL 会慢,有可能的原因是,堵塞:服务器资源不够而造成的排队等待,或者并发引起的竞争条件,即我们访问的资源被别的进程给锁住了;为什么我们的 存储过程会突然变慢,有可能的原因是因为重新编译了,导致 CPU 变高,也有可能是因为 parameter sniff(参数嗅探带来的计划缓存)。当然这本书里还提到了逻辑处理与物理处理,即在我的微信公众号有篇文章提到的执行计划的Physical Operation(物理操作符). 这是 SQL 编写层面的, 但是也能解释,Join 中的 on 与 From 中的 where ,对最终结果的影响。数据库级别的调优,本质上都要考虑整个库的输出质量,是对各个组件的平衡,以达到满足绝大部分请求。

**《数据库索引设计以及优化》:**索引在我们平时的 SQL 调优中,肯定是会优先考虑的步骤。那么你知道为什么索引要定期重建吗;为什么要将一些无关的字段也放进索引里面;为什么在数据仓库中药使用位图索引呢? 这本书围绕着索引讲述了大量的索引实际操作,以及讲解为什么要这么建。如果我们不知道成本优化的概念,其实有好的索引放在库里,但是优化器并没有引用这个索引,我们也无法去引导优化器使用这个索引。书中还特别指出了优化器的盲点,需要人去做调度。这本是优化器的一个缺陷,但是给了 AI 从全量数据角度去帮我们做优化决策的一个入口。

《Database System implementation》,即《数据库系统实现》。再有兴趣的同学可能需要研读一下这本书了,虽说是教科书,但是各家数据库的供应商毕竟都有自己对 SQL 引擎的实现方式。万变不离其宗,基本原理就在这里。