第一个问题:什么是数据库?

      数据,现在被誉为工业社会的“石油”。数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经 加工的原始素材。数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。

在计算机系统中,数据以二进制信息单元0,1的形式表示,被存储在磁盘或者内存当中。

    数据库是数据管理的产物。数据管理是数据库的核心任务,内容包括对数据的分类、组织、编码、储存、检索和维护。随着计算机硬件和软件的发展,数据库技术也不断地发展。从数据管理的角度看,数据库技术到目前共经历了人工管理阶段、文件系统阶段和数据库系统阶段。

第二个问题:为什么要使用数据库?

A.人工管理阶段     人工管理阶段是指计算机诞生的初期(即20世纪50年代后期之前),这个时期的计算机主要用于科学计算。从硬件看,没有磁盘等直接存取的存储设备;从软件看,没有操作系统和管理数据的软件,数据处理方式是批处理。     这个时期数据管理的特点是:   1. 数据不保存     该时期的计算机主要应用于科学计算,一般不需要将数据长期保存,只是在计算某一课题 时将数据输入,用完后不保存原始数据,也不保存计算结果。   2. 没有对数据进行管理的软件系统     程序员不仅要规定数据的逻辑结构,而且还要在程序中设计物理结构,包括存储结构、存取方法、输入输出方式等。因此程序中存取数据的子程序随着存储的改变而改变,数据与程序不具有一致性。   3. 没有文件的概念       数据的组织方式必须由程序员自行设计。   4. 一组数据对应于一个程序,数据是面向应用的     即使两个程序用到相同的数据,也必须各自定义、各自组织,数据无法共享、无法相互利用和互相参照,从而导致程序和程序之间有大量重复的数据。

B.文件系统阶段      文件系统阶段是指计算机不仅用于科学计算,而且还大量用于管理数据的阶段(从50年代后期到60年代中期)。在硬件方面,外存储器有了磁盘、磁鼓等直接存取的存储设备。在软件方面,操作系统中已经有了专门用于管理数据的软件,称为文件系统。     这个时期数据管理的特点是:   1. 数据需要长期保存在外存上供反复使用     由于计算机大量用于数据处理,经常对文件进行查询、修改、插入和删除等操作,所以数据需要长期保留,以便于反复操作。   2. 程序之间有了一定的独立性     操作系统提供了文件管理功能和访问文件的存取方法,程序和数据之间有了数据存取的接口,程序可以通过文件名和数据打交道,不必再寻找数据的物理存放位置,至此,数据有了物理结构和逻辑结构的区别,但此时程序和数据之间的独立性尚还不充分。   3. 文件的形式已经多样化     由于已经有了直接存取的存储设备,文件也就不再局限于顺序文件,还有了索引文件、链表文件等,因而,对文件的访问可以是顺序访问,也可以是直接访问。      4. 数据的存取基本上以记录为单位

利用文件存储数据的操作起来会十分痛苦: 开发人员需要熟悉操作磁盘文件的方法、必须编写复杂的搜寻算法才能高效的把数据从文件中检索出来、当数据格式发生变化时,需要编写复杂的文件格式升级程序、很难控制并发修改。所以我们有了数据库,对数据统一进行管理,并且针对数据的类型划分成不同的种类。。

C.数据库系统阶段     数据库系统阶段是从60年代后期开始的。在这一阶段中,数据库中的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用的。数据库系统阶段的特点是:      1. 采用复杂的结构化的数据模型      数据库系统不仅要描述数据本身,还要描述数据之间的联系。这种联系是通过存取路径来实现的。      2. 较高的数据独立性      数据和程序彼此独立,数据存储结构的变化尽量不影响用户程序的使用。      3. 最低的冗余度      数据库系统中的重复数据被减少到最低程度,这样,在有限的存储空间内可以存放更多的数据并减少存取时间。      4. 数据控制功能      数据库系统具有数据的安全性,以防止数据的丢失和被非法使用;具有数据的完整性,以保护数据的正确、有效和相容;具有数据的并发控制,避免并发程序之间的相互干扰;具有数据的恢复功能,在数据库被破坏或数据不可靠时,系统有能力把数据库恢复到最近某个时刻的正确状态。

数据库怎么存储数据?

答案是:一般数据库还是依赖与操作系统的文件读写,来存储数据到磁盘

操作系统是以文件形式保存数据,关系型数据库我们是一行一行的数据。那么去保存在磁盘上,我们是一行一行的去保存吗?我们需要自己实现存储机制,并且每操作一行都要去写磁盘。那样事不可接受的。所以绝大多数数据库还是利用操作系统的文件读写机制来存储数据到磁盘。但是操作系统是看不到某条记录的,只能看到文件,实际上要找到某行的数据,我们需要首先找这个文件,然后打开文件去找,根据记录找到我们的数据。

比如:我有40行记录,但是我40行记录存成一个文件,存到磁盘的一个扇区。后面会降到页,搜线其实是找到记录所有在页,页上面有标示,表明我存储了从哪一行到哪一行到数据。这种信息一般很小会载到内存中,那么我们就能很快地找到这个文件,剩下的就是移动磁头去读了。

数据库文件体系结构

现在我们以mysql为例子来看一下数据库文件体系结构:

如下图是MySQL(5.7.18)在Linux系统yum默认安装的数据文件目录,可以看到有如下几类文件。

为什么要将数据存储在mysql数据库_mysql

数据库路径:可以看到,系统数据库和用户自定义的数据库都是一个路径,展开具体的路径之后是具体的每个数据库自己的对象。由此可见数据库系统是建立在文件系统基础之上的。通过文件路径与物理存储来映射,最终是映射到外部存储也就是磁盘上。

数据库磁盘存储:

数据库管理系统将数据存储在磁盘、磁带以及其他的裸设备上,虽然这些设备的访问速度相比内存慢很多,但其非易失性和大容量的特点使他们成为数据存储的不二之选。

为什么要将数据存储在mysql数据库_数据库_02

为什么要将数据存储在mysql数据库_数据库系统_03

一次完整的输入输出(IO)操作的时间=磁盘轴旋转时间(旋转延迟)+磁盘臂移动时间(寻道时间)+数据传输时间。三者所需时间的平均经验值为:0.004秒、0.008秒和0.0005秒。所以,一次完整的IO时间的经验值是0.0125秒,即1/80秒

对于大型数据库而言,即便是这极短暂的0.0125秒,频繁的IO操作会将这微不足道的时间累积得非常可观,因此磁盘存储的优化对于数据库效率的提升是非常必要和重要的。我们都知道木桶原理,短板绝对整体的好坏,而数据库系统中这个短板正是由于我们 使用的硬件设备里最弱的磁盘所导致。很多时候,我们会发现系统中I/O累得要死,而CPU却在那里空闲等待,主要是由于I/O执行响应时间太长,处理读写的速度远远赶落后于CPU的处理速度,这时我们会尽可能的让操作放到内存中进行,由磁盘与CPU的关系,转变成内存与CPU的关系,会使用内存中的缓冲池来最小化磁盘活动。甚至有专门基于内存的内存数据库比如redis。不同的数据库产品的磁盘存储内部实现是不同的,在这里不对此进行展开。

mysql的默认数据库存储引擎是InnoDB,在 InnoDB 存储引擎中,所有的数据都被逻辑地存放在表空间中,表空间(tablespace)是存储引擎中最高的存储逻辑单位,在表空间的下面又包括段(segment)、区(extent)、页(page):

为什么要将数据存储在mysql数据库_mysql_04

同一个数据库实例的所有表空间都有相同的页大小;默认情况下,表空间中的页大小都为 16KB,当然也可以通过改变 innodb_page_size 选项对默认大小进行修改,需要注意的是不同的页大小最终也会导致区大小的不同:

磁盘的存储概念:

  • 扇区:每个同心环叫做一个扇区,扇区是磁盘的最小存储单元。当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间;然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。
  • 页:由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。预读可以提高I/O效率。预读的长度一般为页(page:计算机管理存储器的逻辑块-通常为4k)的整倍数. 主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中。

文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在B+Tree每次新建一个节点的同时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

什么是一次IO?

读/写IO,最为常见说法,读IO,就是发指令,从磁盘读取某段扇区的内容。指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读,还是写。磁盘收到这条指令,就会按照指令的要求,读或者写数据。控制器发出的这种指令+数据,就是一次IO,读或者写。

磁盘保存数据有两种方式: 1、随机存储 2、顺序存储

为什么要将数据存储在mysql数据库_数据库_05

随机存储比顺序存储读大文件会慢几万倍。

大/小块IO,指控制器的指令中给出的连续读取扇区数目的多少,如果数目很大,比如128,64等等,就应该算是大块IO,如果很小,比如1, 4,8等等,就应该算是小块IO,大块和小块之间,没有明确的界限。 连续/随机IO,连续和随机,是指本次IO给出的初始扇区地址,和上一次IO的结束扇区地址,是不是完全连续的,或者相隔不多的,如果是,则本次IO应该算是一个连续IO,如果相差太大,则算一次随机IO。连续IO,因为本次初始扇区和上次结束扇区相隔很近,则磁头几乎不用换道或换道时间极短;如果相差太大,则磁头需要很长的换道时间,如果随机IO很多,导致磁头不停换道,效率大大降底。

其它概念:

**磁盘簇:**扇区是磁盘最小的物理存储单元,但由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理。每个簇可以包括2、4、8、16、32或64个扇区。显然,簇是操作系统所使用的逻辑概念,而非磁盘的物理特性。为了更好地管理磁盘空间和更高效地从硬盘读取数据,操作系统规定一个簇中只能放置一个文件的内容,因此文件所占用的空间,只能是簇的整数倍;而如果文件实际大小小于一簇,它也要占一簇的空间。所以,一般情况下文件所占空间要略大于文件的实际大小,只有在少数情况下,即文件的实际大小恰好是簇的整数倍时,文件的实际大小才会与所占空间完全一致。

扇区:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。通常情况下每个扇区的大小是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节。每个同心环叫做一个扇区,扇区是磁盘的最小存储单元。当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间;然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。 ————————————————

磁盘块:逻辑层面: **磁盘块(虚拟出来的)。 块是操作系统中最小的逻辑存储单位。操作系统与磁盘打交道的最小单位是磁盘块。**操作系统是通过块簇来做为单位读取等操作数据的。文件系统就是操作系统的一部分,所以文件系统操作文件的最小单位是块。目的:1.读取方便:由于扇区的数量比较小,数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作。2.分离对底层的依赖:操作系统忽略对底层物理存储结构的设计。通过虚拟出来磁盘块的概念,在系统中认为块是最小的单位。。

磁盘控制器:其作用除了读取数据、控制磁头等作用外,还有的功能就是映射扇区和磁盘块的关系。

块与页的关系:操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位