数据库的工作原理(一)

开始之前的说明:最近在学习数据库的相关知识,找到了一篇很好的学习文章,写的蛮深入,同样内容也很长,所以理解起来有些难度。为了让自己更好的理解数据库的工作原理,我把自己对这篇文章的理解,写成了这篇博客(共计三篇),旨在提高自己的学习效果。
原文地址:http://blog.jobbole.com/100349/。

前言:在了解数据库是如何工作的内容之前,需要知道一些基本概念。在很久以前,开发人员需要把常用的算法和数据结构牢记于心,因为当时计算机的处理能力较差,无法承受对cpu的浪费。研究数据结构和算法的目的,或者说选择哪个数据结构和算法,是为了以更快的速度得到数据处理的结果。判断一个算法优劣的因素大体上有三个:
(1)时间复杂度
(2)算法的内存消耗
(3)算法磁盘I/O消耗
这里主要介绍时间复杂度的概念。
PS:《数据库工作原理(一)》主要梳理相关的基础概念。

一、 时间复杂度

时间复杂度指的是某个算法处理一定量数据所要消耗的时间。这个时间我们无法进行准确的计算,但是可以通过“某个算法处理一定量的数据需要多少次运算”来间接的判断算法的优劣。这里我们使用O(某函数)这样的方式来表示某个算法处理一定量的数据进行的运算次数,所需的运算次数即函数计算出的值,比如像下面这样。
假设有1000000笔数据,各个算法的运算次数如下:

  • O(1) 算法会消耗 1 次运算
  • O(log(n)) 算法会消耗 14 次运算
  • O(n) 算法会消耗 1,000,000 次运算
  • O(n*log(n)) 算法会消耗 14,000,000 次运算
  • O(n^2) 算法会消耗 1,000,000,000,000 次运算

这样我们就很容易得知,O(1)算法是我们首要选择的,O(n^2)是我们绝不会选择的算法。

了解了时间复杂度的概念以及如何表示时间复杂度后,接下来的内容会容易理解很多,比如:

  • 一个好的哈希表会得到O(1)复杂度,这是最理想的状态
  • 一个均衡的树会得到O(log(n))复杂度,其中n代表数据量,即要处理数据的数量大小
  • 一个阵列会得到O(n)复杂度
  • 最好的排序算法具有O(n*log(n))复杂度
  • 糟糕的排序算法具有O(n^2)复杂度。

这里的哈希表、B树、阵列,它们是不同的数据结构。根据他们能够得到的时间复杂的不同,我们当然会尽可能选择时间复杂度低的那一个。

二、数据结构

数据结构可以类比为房屋结构,就像不同屋子有不同的结构一样,每种不同的房屋结构会有不同的用途。比如工业厂房会很大,而且比较空旷,用于进行工业生产;写字楼的结构比较复杂,用于人们上班办公;居民房的结构相比会小一些,用于居住等。数据结构也一样,不同的数据结构有不同的适用场景,我们不能直接评论数据结构的好坏之分,但是会有一个评判标准,就是处理数据的速度。

如上所说的一样,不同的房屋结构适用于不同场景。数据结构也一样,有的数据结构善于处理这种情况,有的数据结构善于处理那种情况。例如:

  • 阵列,用于数据量比较小的情况,它的时间复杂度为 O(n)
  • 树,善于处理“查找一个确定值”的情况,它的时间复杂度为O(log(n)),树是阵列的优化。
  • B树,善于处理“查找范围值”的情况,它需要消耗 M+log(N)次运算
  • 哈希表,用于快速查找某个值。

数据结构是数据库内部的基本组件。

三、数据库概览

数据库说白了,其实是一堆文件的集合,一个信息集合,对这一堆文件进行精心的设计就是数据库干的工作。比如可以快速处理数据(如查询),使用事务来保证数据的安全和唯一性等。

数据库是信息的集合,那么可以把它想象成数据的仓库。既然是仓库,那么就需要管理,管理就需要工具,数据库的各种组件就属于是工具,他们用来管理这个大仓库中的不同事务。

这张图上列出了数据库内的各组件。包括客户端管理器、查询管理器、数据管理器等。

下一篇将会着重介绍数据库的一个很重要的管理器–查询管理器。