关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:《 How does a relational database work》。

原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies

本文翻译了如下章节:

一、 前言

谈到关系型数据库,我想不到有什么东西能缺少它,可以说关系型数据已经无处不在。存在各种不同的关系型数据库:从轻量有用的SQLite到功能强悍的数据仓库。

但是,这只是一篇介绍关系型数据库工作原理的简短文章。你可以google“关系型数据库工作原理”,介绍数据库工作原理的文章少之又少。并且,即使有,这些文章有也很简短;原理也没有讲透。如果你搜索当前最流行的技术(Big Data、NoSQL和JavaScript),你能找到很多深入讲解它的原理的文章。

是关系型数据库太老,技术太陈旧了吗? 除了大学课堂和研究论文外,没有人感兴趣,去说一下它的原理。

作为一个程序员,我讨厌使用我不理解的东西。并且,如果一种数据库已经使用了超过40年,那一定是有原因的。这些年,我花了成百上千个小时去弄懂我每天都在使用的数据库下面的黑盒。关系型数据库非常有趣,因为它是基于一些非常有用的,可推而广之的理念。如果你对数据库非常感兴趣,但是没有时间深入去研究整个数据库领域。那么这篇文章将非常适合你。

本文的标题已经很明确,这不是一篇介绍如何使用数据库的文章。因此,你应该已经知道如何写简单的连表查询和基础的CRUD数据库操作SQL语句。否则,你可能无法理解本文。这是你需要提前掌握的基础知识,其它知识本文都会逐一讲解。

本文是一篇篇幅长,技术性很强的文章;包含很多算法和数据结构。需要花费你较多的时间去阅读。一些概念很难理解,你可以跳过它们去了解文章的大意。

为了方便你掌握,文章分为三部分:

  1. 整体介绍数据库包含哪些组件。
  2. 查询优化概述。
  3. 事务和缓存处理介绍。

二、Back To Basic-回到基本概念上

很久以前(银河系诞生之前…哈哈), 开发者必须很明确的知道所编写代码需要使用的CPU操作指令数量。他们对代码中用到的算法和数据结构明察秋毫,因为他们不能浪费一丁点CPU和内存资源。计算机太慢了,资源很宝贵。

本章,我将唤起你对一些基本概念的学校记忆,理解这些概念对理解数据库不必可少。我也会介绍什么是数据库索引。

(一)O(1) VS O(n^2)

现今,很多程序员不关柱时间复杂度,而且… 他们往往还是对的!

但是,当你处理大数据的时候(不是仅有几千条数据)或者你在为优化性能到毫秒级奋战的时候。理解时间负杂度的概念就非常关键。想象一下,数据库要同时处理上面两种场景。我不会浪费你太多时间,仅仅介绍一下基本概念。这将帮助我们后面理解 Cost Based Optimization概念。

(二)The Concept - 基本概念

时间复杂度被用于衡量一个算法处理指定量的数据所花费的时间。为了描述时间复杂度,计算机科学家使用数学符号大写的O表示。这个符号通常与一个函数结合使用,这个函数描述了一个算法处理指定数量的输入数据需要执行的CPU指令条数。

例如,当我说“某个算法是O(some_function())”时,意思是对于给定数量的数据,该算法需要执行的指令条数是some_function(数据数量)。

重要的不是数据的数量或者指令的数量,而是随着数据量的增长,指令数量将以什么样的方式向上增加。时间复杂度不能用于统计一个算法需要执行的精确指令条数,但是是一个用于评估的好方法。

在这张图中,你能看到不同时间复杂的演化。数据量我按指数级逐渐放大,换句话讲,数据将从1很快增长到10亿。我们看一下不同时间复杂度算法需要执行的指令数量如何变化:

1. (1)始终保持常量(否则,它也就不叫常量时间复杂度了)。

2. O(log(n))始终保持在一个低增长率,即使数据量达到10亿级。

3. 最差的是O(n^2)。操作指令数量随数据量增大,急速膨胀。

4. 另外两种时间复杂度也增长得很快。

(三)Examples – 举个例子

在数据量很小的时候,O(1)和O(n2)的差异可以忽略不计。例如,假设我们的算法要处理2000条数据:

1. O(1)的算法需要执行1条CPU指令。

2. O(log(n))的算法需要执行7条指令。

3. O(n)的算法需要执行2000条指令。

4. O(n*log(n))的算法需要执行14000条指令。

5. O(n^2)的算法需要执行4000000条指令。

O(1)和O(n2)的差异看起来很大, 差了4百万。实际上执行时间最多差2毫秒,相当于眨一下眼睛的时间。确实,现代处理已经能每秒处理几百万条指令。这也是为什么性能优化在很多IT项目里面不是重心。

但是 听我说,理解这些概念在处理超大数据时仍然非常有用。如果要处理的数据变成了1000000条(对数据库来讲,也不是很大的数据量):

  1. O(1)的算法需要执行1条CPU指令。
  2. O(log(n))的算法需要执行14条指令。
  3. O(n)的算法需要执行1000000条指令。
  4. O(n*log(n))的算法需要执行14000000条指令。
  5. O(n^2)的算法需要执行1000000000000条指令。

我无法精确计算,但是我敢说执行一次O(n2)的算法,你可以去喝一杯咖啡了(或者是两杯)。如果在数据量上再加一个0,你就可以去睡一觉了。

(四) Going Deeper – 更深入一点

抛出一个观点:

  1. 在一个优秀的Hash Table中查询一个元素的时间复杂度是O(1)。
  2. 在一个优秀的的二叉平衡树中查询一个元素的时间复杂度是O(log(n))。
  3. 在一个数据组查询一个元素的时间复杂度是O(n)。
  4. 最好的排序算法的时间复杂度是O(n*log(n))。
  5. 差的排序算法的时间复杂度是O(n2)。

    备注:下面我们将看一下这些算法和数据结构。

一个算法的时间复杂度也分多种场景:

  1. 通用场景下的时间复杂度。
  2. 最优场景下的时间复杂度。
  3. 最差场景下的时间复杂度。

一个算法的时间复杂度通常就是最差场景下的时间复杂度。

我仅谈论了算法的时间复杂度,实际上算法的复杂度还包含这些:

  1. 算法消耗的内存大小。
  2. 算法消耗的磁盘I/O。

当然,还有比O(n^2)更差的一些时间复杂度:

  1. O(n^4):该死,我将会提到有这样复杂度的算法。
  2. O(3^n):更糟糕,我们将会在后面文章中看到一个这样的算法(而且,它真的在很多数据库中用到过)。
  3. 斐波拉西 N: 你永远也不会计算出结果来,即使很小的数据量。
  4. O(n^n):如果你写出了这样一个算法,你该思考一下你是否适合呆在IT领域。

备注:我并没有给符号O下一个准确的定义,我只是介绍了他的思想。如果你想了解它真正它的真正含义,可以上维基百科。

时间: 2024-10-21 08:25:00

关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)的相关文章

关系型数据库工作原理-数据结构(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 本文翻译了如下章节: 一.Array.Tree and Hash table 通过前面的章节, 我们已经理解了时间复杂和归并排序的概念,接下来我要介绍三种数据结构.这三种数据结构非常重要,它们是现代数据库系统的基础.我也会介

关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 先翻译快速缓存章节.兴许有时间再翻译其他章节. 翻译内容在原文的文件夹: 一.数据管理器 数据查询器运行查询操作,从数据表中获取数据.它向Data Manger发送请求,获取数据.当中存在2个问题: 关系型数据使用事物模型.

关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 紧接上一篇文章,本文翻译了如下章节: 一. Log manager(日志管理) 通过前面的章节,我们已经知道,为了提升性能,数据库会将数据缓存在内存中.但是,如果在事务提交过程中,数据库服务器崩溃了.缓存在内存的数据就会丢失

MySQL数据库工作原理

接触一个新的事物的时候,是有必要从其工作原理入手,弄清楚这个东西的来龙去脉,为接下来的继续深入学习做好铺垫,掌握好其原理有助于我们从整体上来把握这个东西,并且帮助我们在排错过程中理清思路.接下来,还是从mysql的工作原理开始入手,下面先来一张经典的图: 上面的图就是mysql的内部架构,可以清楚的看到Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的. 下面是关于上述部件的介绍: connectors 与其他编程语言中的sql 语句进行交互,如php.java等. Manageme

您的位置:上海剑阀阀门有限公司 &gt; 新闻中心 &gt; 阀门原理 &gt; 过滤器工作原理(图)

过滤器(Filter Valve)是输送介质管道上不可缺少的一种装置,当介质中杂质太多,会影响设备运行的情况下,根据杂质的细粗来选择滤网目数大小,通过滤网将杂质过滤出来,确保后方设备的正常运行,当需要清洗时,只要将可拆卸的滤筒取出,清洗后重新装入即可,因此,使用维护极为方便.过滤器工作原理(图) 过滤器是除去液体中少量固体颗粒的小型设备,可保护设备的正常工作,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而清洁的滤液则由过滤器出口排出,当需要清洗时,只要将可拆卸的滤筒取出,处理后重新装入即可

针型阀工作原理(图)

针型阀(Needle Valve)是仪表测量管路系统中重要组成部分,是一种可以精确调整.切断流体的阀门,阀芯就是一个很尖的圆锥体,一般用于较小的流量,较高压力的气体或者液体,结构跟截止阀形似,其功用是作开启或切断管道通路用的阀门.针型阀工作原理(图) 1.针型阀启闭件是一个尖型圆锥体,开启时逆时针旋转,关闭时顺时针旋转.2.内部结构与截止阀形式差不多,都是低进高出,通过手轮带动阀杆传动. 针型阀结构原理 1.针型阀在低温介质的管路系统和装置上,宜选用加上阀盖的低温针型阀. 2.炼油装置的催化裂化

蝶阀工作原理(图)

蝶阀(Butterfly Valve)启闭件是蝶板,由阀杆带动,在阀体内绕其自身的轴线旋转90°,从而达到启闭或调节的目的.在管路中主要用来做切断介质,结构简单,操作灵活,开关迅速,尺寸小,结构短,阻力小,重量轻等特点.蝶阀工作原理(图)  1.启闭方便迅速.省力.流体阻力小,可以经常操作. 2.结构简单,外形尺寸小,结构长度短,体积小,重量轻,适用于大口径的阀门. 3.可以运送泥浆,在管道口积存液体最少. 4.低压下,可以实现良好的密封. 5.调节性能好. 6.全开时阀座通道有效流通面积较大,

呼吸阀工作原理(图)

呼吸阀(Breathing Valve)用于储罐气压平衡,减少介质挥发的安全节能产品,其原理是利用正负压阀盘的重量来控制储罐的排气正压和吸气负压:确保罐内的压力不再继续下降或上升,让罐内与罐外的气压平衡,是保护储罐的安全装置.呼吸阀工作原理(图) 1.当罐内介质的压力在呼吸阀的控制操作压力范围之内时,呼吸阀不工作,保持油罐的密闭性:2.当储罐内压力过高时(作业人员往储罐输送汽油时,罐内开始增压)达到设定的压力时,呼吸阀开始工作,呼吸阀正压阀盘被打开,将储罐内产生的气压开始往外排出,当罐体内的压力

排气阀工作原理(图)

排气阀(Exhaust Valve)用于流体管路系统中作为排气作用,在输水过程中,空气在水中不断地释放出来,形成空气袋,使输水变得困难,当系统中有气体溢出时,气体会顺着管道向上爬,最终聚集在系统的最高点,这时排气阀通过浮球杠杆原理开始工作排气.排气阀工作原理(图) 当系统中有气体溢出时,气体会顺着管道向上爬,最终聚集在系统的最高点,而排气阀一般都安装在系统最高点,当气体进入排气阀阀腔聚集在排气阀的上部,随着阀内气体的增多,压力上升,当气体压力大于系统压力时,气体会使腔内水面下降,浮筒随水位一起下