DBMS设计之初便假定数据主要位于非易失性的磁盘上,毕竟内存容量有限。而磁盘的访问速度远远大于内存访问速度,因此数据库存储引擎一项重要工作便是:管理数据在内存与非易失性存储之间移动,提高数据访问速度和效率。

1.数据的组织方式

数据在磁盘上以文件形式存储,数据库的存储引擎通常以固定大小的page(有的数据库称为block)为单位组织文件,读写磁盘均以page为单位。page里可以存放tuples货metadata货indexes等。每个page都有一个唯一标识,DBMS会维护page id到物理地址的映射关系。不同数据库DBMS产品page大小不同,比如:SQLite 1KB, Oracle/DB2 4KB, SQL Server/PG 8KB, MySQL 16KB。

不同的DBMS组织page的方式也不同,目前较常见的方式是Heap File Organization,page以链表(下图左)或page目录(下图右)的形式组织。

链表的方式可以通过记录header page,维护data page list和free page list。目录的方式(树)则维护特殊索引页,记录数据页位置。当然这两种方式是可以混合用,综合他们各自的优势,例如MySQL的默认存储引擎InnoDB B+树索引的实现。

目前还有另一种流行的组织方式Log Structued File Organization。这种方式存储log记录,而非传统意义上的tuple。当有insert/update/delete操作发生时,相应的记录会追加到数据库中。其中insert存储tuple,delete标记要删除的tuple,update只包含被更改的那部分信息。当需要去查询某个记录时,会根据对同一条记录的操作“组装”出最终结果,当然这里有很多优化策略和手段(建索引、compact等),LevelDB,Hbase,RocksDB都是以这种形式存储组织数据的。

2.DBMS如何在内存和磁盘之间移动数据

数据以page为单位读入内存、写入磁盘,那么数据的移动何时发生,如何操作呢?OS的mmap功能可以将文件映射到内存,那么能不能直接利用OS的换页机制来处理page移动呢?这么做的问题在于(1)0DBMS丧失了对page的控制权,无法合理调度读取/刷盘。(2)OS在处理一个不在内存的OS page时会stall线程。当然一些数据库有办法在一定程度上规避部分问题,如早期的MongoDB。但完善的数据库系统一般会选择自己处理数据的移动、管理内存中的page。

数据库在内存的buffer pool便是用来缓存磁盘中读取上来的page。buffer pool 同样以page大小管理组织内存块,这样一块内存被称为frame。当DBMS需要时,会将磁盘中的page拷贝到一个frame中。当然有一个page table会记录内存中的所有page及相关的元信息(Dirty Flag、PIN counter等)。不少数据库不只有一个buffer pool。

那么哪些page会被载入内存呢?当查询的目标数据所在page不在内存时,会去磁盘读取,并放入buffer pool缓存,以备后用。这其中有很多优化策略。例如:(1)pre-fetch,即根据数据排列顺序或索引顺序预取后续page到内存,这对scan查询有很好的优化效果。(2)scan sharing,查询结果被多个相似的查询重用或某个表的cursor被多个查询复用。

而buffer pool满了后需要换页,一般选择LRU及其各类优化版本。

mysql 文件组织_数据库如何组织数据?相关推荐

  1. 全国地区 mysql表_数据库表地址数据(中国地区)

    insertintolocation (id,name,fid,language)values(1,'中国',null,0);insertintolocation (id,name,fid,langu ...

  2. C#语言和SQL Server 数据库技术_用表组织数据

    第7章 用表组织数据 数据库本身无法直接存储数据,存储数据是通过数据库中的表来实现的. 一.表相关的几个基本概念 1.数据完整性 实现完整性的方法 *检验每行数据是否符合要求 *检验每列数据是否符合要 ...

  3. mysql表之间怎么联动_数据库之间的数据联动调整方法、装置及系统的制作方法...

    数据库之间的数据联动调整方法.装置及系统的制作方法 [技术领域] [0001]本发明涉及一种信息处理技术领域,特别是涉及一种数据库之间的数据联动调整方法.装置及系统. [背景技术] [0002]随着信 ...

  4. mysql一个表中可以有几个主键_数据库的单个数据表中有几个主键?

    数据库的单个数据表中只能有一个主键.数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性:主键主要是用与其他表的外键关联,以及本记录的修改与删除. 数据库的单 ...

  5. mysql表的组成_数据库中的数据表由什么组成?

    在数据库中,数据表是由表名.表中的字段和表的记录三个部分组成的.在建立表之前都必须先设计它的结构,表结构描述了一个表的框架.设计表结构实际上就是定义组成一个表的字段个数,每个字段的名称.数据类型和长度 ...

  6. xshell安装mysql步骤_数据库Mysql与禅道安装

    一.Linux上搭建禅道 Mysql 是关系型数据库管理系统 1.下载安装包:将安装包直接解压到/opt目录下,不要 解压到别的目录在拷贝到/opt/,因为这样会导致文件的所有者和读写权限改变 2.解 ...

  7. 【一周入门MySQL—1】数据库概述、数据定义、数据操作

    数据库概述.数据定义.数据操作 一.数据库概述 数据库基础概念:按照一定的数据结构来组织.存储和管理数据的仓库. 企业数据存储面临的问题: 存储大量数据: 大量数据的检索和访问: 保证数据信息的一致性 ...

  8. php mysql两个表合并_php操作mysql两个数据库中表的数据同步

    题记: 我们开发当中经常会遇到,数据同步.比如将teaching数据库中area表的数据同步到study数据库中zone表中. 备注:这两个数据库不同,数据表名字也不同,但数据表的结构相同.不同表结构 ...

  9. mysql之创建数据库,创建数据表

    写在前面 项目中用到mysql数据库,之前也没用过mysql,今天就学下mysql的常用的语法,发现跟sql server的语法极其相似.用起来还是蛮简单的. 一个例子 1.创建一个名为School的 ...

最新文章

  1. 三分钟教会你搭建动态网络
  2. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )
  3. 微信小程序 最全 生成带参数二维码
  4. $ajax 筛选某个属性,jQuery
  5. 工业互联网巨头 GE Digital 修复SCADA 软件中的两个高危漏洞
  6. FailSafe双机方案
  7. DB - 常用SQL积累
  8. Python爬虫实战之爬取链家广州房价_03存储
  9. stm32实用技巧:JLINK接口定义和使用JTAG或SW下载程序
  10. 基于Android手机酒店客房预订系统
  11. 【java】模拟物流快递系统程序设计
  12. 现有的评分和排名算法
  13. mysql误删除数据恢复处理
  14. 给IT新人的15点建议:苦逼程序员的辛酸反省与总结
  15. 工欲善其事必先利其器(一) —— VScode
  16. 搞Java的年薪 40W 是什么水平? 1
  17. NOIP模拟赛 麻将
  18. 论文阅读:FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning
  19. DFPlayer Mini资料 随手记
  20. 【阿ken经验总结】要考英语四六级的你一定要知道的!

热门文章

  1. SAP ABAP编辑器里的Code Completion(代码自动完成)的等待时间设置
  2. 基于CDS view生成的OData服务的metadata是如何生成的
  3. how debug option is handled - handle_debug
  4. createBindingContext in SAP UI5
  5. SAP OData Batch request processing in backend
  6. filter in Fiori HANA live report
  7. SAP UI5应用的sap-ui-core.js被加载之前,还有哪些js文件被加载了
  8. 根据SAP SAP Cloud Connector的日志排查错误
  9. One Order CLOSING date修改后的执行原理
  10. 我的2018知乎大数据分析