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

数据,现在被誉为工业社会的“石油”。数据(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默认安装的数据文件目录,可以看到有如下几类文件。

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

数据库磁盘存储:

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

一次完整的输入输出(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):

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

磁盘的存储概念:

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

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

什么是一次IO?

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

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

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

大/小块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.分离对底层的依赖:操作系统忽略对底层物理存储结构的设计。通过虚拟出来磁盘块的概念,在系统中认为块是最小的单位。。

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

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

「数据库系列一」为什么要用数据库?相关推荐

  1. 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  2. 赵强老师:Oracle数据库系列课程(12)管理数据库的存储结构与数据的并发-赵强老师-专题视频课程...

    赵强老师:Oracle数据库系列课程(12)管理数据库的存储结构与数据的并发-82人已学习 课程收益     从零开始学习Oracle数据库,让学员读整个Oracle数据库有个全面清除的认识和学习. ...

  3. 赵强老师:Oracle数据库系列课程(20)优化数据库-赵强老师-专题视频课程

    赵强老师:Oracle数据库系列课程(20)优化数据库-99人已学习 课程介绍         从零开始学习Oracle数据库,让学员读整个Oracle数据库有个全面清除的认识和学习. 课程收益    ...

  4. 「数据库系列杂谈」数据库访问性能优化

    为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 一.数据库访问优化法则简介 ...

  5. 「中间件系列二」redis缓存

    Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis 可以存储键和五种不同类型的值之 ...

  6. 「数据库系列四」分布式数据库CAP理论与最终一致性

    传统关系型数据库中事务有四个重要的特性,简称ACID,即 原子性 : 事务是一个不可分割的工作单位,事务中的操作要么都成功,如果有一个执行失败,所有的SQL将都被撤销,恢复到事务开始的状态 一致性 : ...

  7. 「数据库系列三」磁盘、内存和带宽

    聊聊影响流量的三大物质因素:磁盘.带宽.内存 速度上内存 >带宽(带宽可以看作网络的吞吐量)>磁盘 google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处 ...

  8. 「中间件系列一」kafka消息中间件

    kafka消息中间件 一:为什么需要消息中间件? 1.解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一 ...

  9. 批量修改数据映射_Docker 数据卷操作「Docker 系列-6」

    数据卷入门 在前面的案例中,如果我们需要将数据从宿主机拷贝到容器中,一般都是使用 Docker 的拷贝命令,这样性能还是稍微有点差,没有办法能够达到让这种拷贝达到本地磁盘 I/O 性能呢?有! 数据卷 ...

最新文章

  1. 【OpenCV 4开发详解】Sobel算子
  2. 什么是UUID及其实现代码
  3. MessageBox只弹出一次
  4. c2064 项不会计算为接受0个参数的函数_无网格法理论与Matlab程序设计(6)——传统径向基点插值(RPIM)形函数...
  5. 墓志铭:非常了得其实早已死了
  6. python flask 大文件 下载_flask - python上传大文件到服务器报错
  7. HTML学习笔记06-连接
  8. 关于无法加载已创建的布局文件的问题的解决方案以及已布局在对应的R文件中未生成相应ID的问题的解决
  9. 阶段3 3.SpringMVC·_05.文件上传_5 文件上传之跨服务器上传分析和搭建环境
  10. 2022最新软件设计师历年真题和答案解析分享!
  11. Tomcat 7 下载地址
  12. git lfs mac 安装_GIT LFS 安装及使用
  13. HTTP Security Header Not Detected
  14. Pi-hole黑洞(广告屏蔽)列表的维护思路
  15. 防火墙的访问控制策略
  16. css样式压缩了怎么还原,CSS代码的压缩方法
  17. GNS3 2.1.21详细安装教程
  18. 后付费和账单分期真的可以缓解经济压力么
  19. MIMO-UNet学习
  20. 项目日志20190707

热门文章

  1. 影响一生的职业建议 [转] - 看懂了不一定在高位,在高位的必须看懂了、信息量很大,多学学!...
  2. [转载]C#中注册Dll的问题
  3. 没有RunInstallerAttribute.Yes的公共安装程序。
  4. 很酷的一套 Flex/AIR 皮肤 (KingnareStyle)
  5. vim 怎么显示空格_vim 修改tab为四个空格
  6. kafka mysql安装与配置_Mac环境canal+mysql+kafka的安装及使用
  7. 四、MapReduce和Yarn基本架构
  8. 九、爬虫学会如何入库
  9. 我们又来送书啦!这一次,用做业务的思维讲推荐系统 | 文末福利
  10. 超越谷歌BERT!依图推出预训练语言理解模型ConvBERT