本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies
本文翻译了如下章节, 介绍数据库的查询优化器:
Query optimizer–查询优化器
当前所有流行的数据库都使用基于成本的算法(CBO)优化查询SQL。其思路是为所有的操作指令赋予一个成本值,然后找出能降低成本的最优指令执行链。
为了帮助理解基于成本的优化器是如何工作的,最好的方式是通过一些样例来感受它的复杂性。在整个章节中我将通过三个常用联表操作来说明数据库是如何做优化的,你可以看到即使是对一个最简单的联表查询语句做优化也是十分复杂的。最后我们来看一下真实的数据库优化器是如何做的。
在这些例子中我将聚焦在分析时间复杂度上面,而一个真实的数据库优化器将同时考虑CPU消耗,磁盘I/O消耗和内存需求(译者:类似于程序算法的复杂度度量方式,O(1)、O(n))。
分析时间复杂度和CPU指令执行成本是有一些差异,但是非常近似。如果是分析CPU指令执行成本,我需要计算所有SQL语句的指令条数,包括加法、条件语句、乘法、循环…等等。甚者还要考虑:
- 每一条高级语言的代码语句都有对应数量的低级语言(汇编语言)指令。
- 使用不同的CPU芯片(Core i7, an Intel Pentium 4, an AMD Opteron….),指令的执行成本是不一样的。也就是说,它还取决于不同的CPU架构。
统一使用时间复杂度来度量就简单很多,也不影响我们理解CBO的本质。有时间我也会把磁盘I/O单独拿出来讲,因为它很重要。很多时候,数据库瓶颈在磁盘I/O而不是CPU。