数据库查询优化器的艺术:原理解析与SQL性能优化
上QQ阅读APP看书,第一时间看更新

前言

为什么写这本书

数据库引擎是一项包罗万象的技术大全,纷繁复杂,不能轻易穷尽。

数据库查询优化器是数据库引擎的重中之重。掌握了查询优化器,就等于掌握了数据库的精髓,得查询优化器者则得数据库天下。

在数据库查询优化技术领域,尚没有一本将理论与实践结合的书籍,能帮助查询优化技术的爱好者掌握其全貌、掌握其细节、掌握其精髓、掌握其奥妙

如果能有一本书可以包括数据库查询优化技术的完整面貌,相信一定会使探索者少些崎岖摸索,这自然是一件好事。于是笔者心怀忐忑,虽自知力不能及,但还是决定奋笔一试,如工匠砌砖、蝼蚁啃土,一点一滴,将自己多年总结的经验汇集于此,终于小成。

本书的主要内容

本书主要讨论以下问题:

❏“查询优化”究竟包括什么样的优化技术?为什么能做那些优化?

❏“查询优化器”是怎么实现的?“查询优化器”是怎么做优化工作的?

❏PostgreSQL和MySQL的查询优化器各自实现了什么样的查询优化技术?

❏PostgreSQL和MySQL的查询优化功能有什么异同?

第一个问题在第一篇中进行了讨论。第二、第三个问题在第二、第三篇中通过对PostgreSQL和MySQL查询优化器的源码分析进行了回答。第四个问题在第四篇中通过对PostgreSQL和MySQL查询优化的功能对比,对两者的差异进行了回答。

从全书来看,本书涉及查询优化器的原理、代码实现、工程实践3个部分。

原理部分,概括总结了查询优化器的两大优化策略,一是逻辑优化,二是物理优化。在每一个优化策略中,都结合原理、运用示例,努力展示了查询优化器的全貌。这部分内容将解答:“查询优化”究竟包括什么样的优化技术?为什么能做那些优化?

代码实现部分,通过深入数据库内核的源码,对查询优化器的实现进行深度的、全方位的探索,力求为程序员和数据库爱好者展示数据库引擎查询优化器的真实面目。行文选取了开源数据库PostgreSQL和MySQL的查询优化器,抽丝剥茧,进行了详细、全面的分析。这部分内容将解答:“查询优化器”是怎么实现的?“查询优化器”是怎么做优化工作的?

工程实践部分,通过原理分析、代码分析和示例,进行了以下3个对比:

❏对比PostgreSQL和MySQL的查询优化器的实现异同。

❏对比PostgreSQL和MySQL的查询优化器的功能异同。

❏对比查询优化器和原理之间的异同。

工程实践部分还通过大量详细的示例比较,总结了PostgreSQL、MySQL支持的优化点和不支持的优化点,为DBA调优提供了许多新颖的、好的思路。揭秘内核,帮助读者掌握其实现方式,可使读者在面对SQL调优时不再是雾里看花,而是心中有数。系统地掌握这些,可以超越依靠日积月累的学习方式,能够快速进阶。

工程实践部分通过3个对比,完成了以下3个结合:

❏通过代码分析,首次将关系代数、代价估算等查询优化原理与代码实现、工程实践结合。

❏通过对PostgreSQL和MySQL的对比,首次揭秘了两大开源数据库的查询优化器的异同,使得数据库爱好者能够以本书为基础,更好地结合查询优化技术,进而掌握各种类型的数据库SQL调优。

❏通过原理、代码、分析、示例,完成了将数据库爱好者对查询优化器强烈渴望掌握的愿望与轻松掌握的现实的结合,使得查询优化器不再那么神秘莫测。

本书的主要特色

本书的主要特色如下:

全面揭秘数据库查询优化技术。把数据库的各种查询优化技术以工程化的视角进行剖析,集原理、源码分析、示例实践为一体。

重点分析了PostgreSQL和MySQL的查询优化器的实现。以两大开源数据库的查询优化器的实现为蓝本,分析了它们的实现过程、实现原理,帮助读者深入理解掌握数据库的核心技术,使他们在SQL调优过程中不仅掌握怎么调优而且知道为什么可以调优。

详细对比了PostgreSQL和MySQL的查询优化技术的支持能力。通过大量示例,分析对比了两大开源数据库的查询优化功能的强弱,帮助读者掌握两个数据库查询优化功能相同和不同之处,为应用系统选型提供衡量查询优化功能的依据。

本书面向的主要读者

如果您是一名数据库内核的工作者,本书对数据库查询优化器的内核代码分析,一定会帮您全面掌握查询优化这一技术。再结合理论部分,将使您理解得更加深刻。

本书不仅讲述了PostgreSQL查询优化器的实现,还讲述了MySQL查询优化器的实现,这对于从事这两个数据库内核开发的人员来说尤其有帮助。如果您能把结合本书和源码(务必要读代码)两者相互印证进行掌握,将像弄潮儿涛头立,查询优化技术尽在您的掌中。

本书从理论角度出发构造了大量示例,通过源码和功能的对比分析,更是进一步揭示了这两个数据库查询优化器的功能异同。对于从事查询优化器性能提升的工作人员帮助更大——因为原理部分讲了为什么,代码分析部分讲了怎么做,示例与对比部分讲了有什么不同,可做的事情仅剩下“没有实现的优化怎么做”了。路已铺垫,启示已明,发挥就靠您自己了。

如果您是一名数据库实践者、DBA,本书一定会帮到您。查询优化器能做什么样的优化?为什么查询优化器能做某种类型的优化?对于这两个问题,原理部分能帮您解惑。如果您是一名DBA,您将更多地从代码分析、工程实践部分获益。源码级的内幕揭秘,无疑能帮您更好地做好SQL语句的日常优化工作;代码、功能、实践的比较,无疑能帮助您从初学到理解,进而过渡到得心应手地应用。

生活不是一成不变的,工作中您也许会在PostgreSQL与MySQL间切换,掌握原理又能帮您以不变应万变。本书所涉及的查询优化器的知识,适用于Oracle的DBA、DB2的DBA、SQLServer的DBA、SYSBASE的DBA。也许从此以后,您会成为一名万能的DBA!

如果您是一名数据库研究者、开发者、教学者、学生、爱好者,那么本书对您来说是一本不可多得的参考资料。查询优化器作为数据库中最重要、最难学、最精彩的部分,探索起来道路漫长,艰苦而无趣,也许本书能有幸成为您的同行伙伴,一路走来,不离不弃。探索数据库内核,犹如面对一座大山,陡峭艰险,无路可寻。看似非常艰难的事情,当您一书在手,仿佛为您提供了一柄手杖,步行于山涧沟壑时,且健且速。

特别是对于学生,如果能凭着这本薄书摸索进入数据库内核的世界,当是笔者最大的心愿。学生是未来的栋梁,是将技术发扬光大的希望。

多年来,作者一直翘首以盼,希望能有这么一类书,与己成为好友。现在,有了这么一本薄书,唯愿读者开卷有益。

如何阅读本书

从模块的角度看,本书可分为4部分:原理、PostgreSQL实现、MySQL实现、三者对比总结。所以建议读者以模块为单位分别阅读。如果是读PostgreSQL实现、MySQL实现的章节,则应结合代码,前后联系沟通为好,不要掌握局部忽视整体。

从内容的分布上看,原理是综述部分,既讲述了原理对查询优化的指导,也对PostgreSQL实现、MySQL实现进行了总结,所以要从实践个例上升到理论的高度才能看清全貌。把原理和PostgreSQL实现结合起来,反复互为印证,会对掌握PostgreSQL有帮助;把原理和MySQL实现结合起来,反复互为印证,会对掌握MySQL有帮助;把4部分完全结合起来一起掌握,不仅可以帮助DBA和爱好者理解PostgreSQL、MySQL,还可以帮助他们理解其他数据库。因为本书中的两套源码的比较加上原理的解析,有助于帮助理解其他数据库查询优化器的原理;示例则有助于在其他数据库上执行以检查数据库对查询优化的支持程度。

另外,为便于读者更好地掌握数据库查询优化技术及本书内容,本书的附录从方法学的角度对阅读本书提供了4个方面的建议。

为什么特别推荐学生阅读本书

对于爱好数据库技术的学生来说,选择数据处理技术,是一条明智之路。数据越来越多,数据源越来越多,大数据的时代不仅已经来临了,而且会一直发展、不断发展。数据库技术是处理大数据的核心技术,数据库技术会随着时代的需求,一直前进。而查询优化,在数据库领域,不仅有着重要的理论地位,而且在实践中也异常重要且用途广泛,SQL调优占据着数据库性能调优的半壁江山。

现今,就业竞争异常激烈,一份好的工作往往会有数以千计的人同时去争取。这对于诸多刚刚毕业、没有什么工作经验的学生来说,无疑是非常严峻的考验,尤其对于想找到理想工作的学生更是难上加难。因为现在用人单位提供的工作岗位对应聘者的素质和技能的要求越来越高,这无疑是刚刚毕业的学生最大的短板。

对于用人单位来说,想招到一名合格的员工也不容易,招到一名技能纯熟、素质高的员工更难。

在这样的大背景下,如果学生在求学期间能够打下良好的专业基础,找工作时定会增加很多机会;如果学生能够在自己的专业领域深入探索,对数据结构、操作系统、数据库等重要课程熟练掌握,使自己具备良好的专业素质,必然能使自己在找工作时具备更强的竞争力;如果学生能在某些课程上把理论和实践结合起来,把理论和源码结合起来,熟练掌握重量级软件的内核代码,找到心仪的工作将更为容易。用人单位喜欢有理论、工作初始就能上手做事的人才。而学生们想成为这样的人才,就需要在学校里打下坚实的基础。

本书在数据库领域就能起到这样的作用。引领学生把数据库理论和数据库实践结合起来,把数据库理论和数据库引擎源码结合起来,有效帮助读者梳理数据库技术中最重要的部分——查询优化技术的全貌,这必定对掌握这部分技术有很大的帮助。

所以,笔者特别推荐学生阅读本书。建议在本科高年级阶段或研究生阶段,大家能与本书为伴,边读源码(PostgreSQL和MySQL的源码)边读本书,互为印证。笔者相信通过短短数月的努力,大家得到的将是足够好的技能、足够高的起点、足够强的竞争力!

学生是未来、是希望,学生强,社会亦将受益。学生若能通过本书使自己变强,将是笔者最大之幸。

勘误及支持

由于笔者的水平有限,书中难免会有笔误、差错、格式错误或遗漏等问题,希望广大读者能把发现的错误告诉笔者,我将不胜感谢。本书的进步和完善,有您的帮助和爱护,定能再上一层楼。您可以发送电子邮件到:database_XX@163.com。由于时间有限,也许笔者不能一一答复所有的电子邮件,但是会定期整理并汇总信息到笔者的博客(http://bolg.163.com/li_hx)上。

书中分析、探索的数据库源码的下载地址如下:

PostgreSQL,V9.2.3,源自http://www.postgresql.org/ftp/source/v9.2.3/。

MySQL,V5.6.10,源自http://dev.mysql.com/downloads/mysql/。

致谢

在我的生命中,家人是最重要的。伏案疾书不舍昼夜,心中一直牵挂的是父母、姐妹、妻子和各地的亲人们。他们是我写作的动力源泉,他们是我得以坚持完稿的坚强后盾。感谢父母给予了我生命并育我成人,感谢妻子朝夕相伴给予我鼓励和慰藉,感谢我远方的亲人们让我心意暖暖。

感谢中国人民大学信息学院王珊教授多年的教导,并高屋建瓴地为本书提出修订意见,她严谨的工作作风影响了本书的风格。成书之际,王老师乐为作序,我心怀感激,念念在心。

感谢为开源社区无私奉献的人们,没有他们就没有本书。本书的内容源于对开源数据库内核代码的分析,故笔者认为本书也应该回归社区为众人服务。坚持写下自己的所得,与他人共享,是一件快事,也是一件幸事。

感谢编辑杨福川先生和孙海亮先生为本书付出的努力和耗费的心血,书名源于杨先生,书稿样式由孙先生设定。写了一本书,交了两个好朋友。谢谢他们。

感谢每一位读者,我们一起进步,你们将是本书继续完善的新动力。

我深知本书尚不能达到书名标识的高度,而今迈步从头越。