深入理解数据库系统之存储存引擎数据和索

文章(参见文末链接)介绍了数据库系统体系架构,基于内存与磁盘存储的数据库管理系统的差异,以及行式存储和列式存储数据系统。这篇文章就要介绍数据库系统的数据文件和索引文件。数据文件和索引文件数据库系统的主要目的是存储数据和快速检索数据。但是数据该如何存储才能实现快速检索呢?是使用文件来存储数据吗?答案是数据库系统确实使用文件来存储数据,但是数据会以特殊的格式来保存到文件中。特殊的存储格式可以确保:存储效率最高:存储每条数据记录的额外开销最小。访问效率最高:数据记录能够以最少的步骤被访问。更新效率最高:对磁盘数据做最少改动就能完成记录更新。数据库系统的表中存储了由多个字段构成的数据记录,每个表保存在一个单独的文件中。表中的每一条记录可以通过搜索键查找到,为了能快速从文件中查找到对应记录,数据库系统使用索引。索引实际上是一种特殊的数据结构,它可以帮助在数据文件中快速定位数据记录,而且不需要扫描整个数据文件中的所有数据记录。通常索引会在一个或一组能够能识别数据记录的字段上构建。通常数据库系统的数据记录和索引是分别存储到不同文件中的:数据文件存储数据记录;而索引文件索引数据。索引文件通常比数据文件小,通过索引文件中的数据就可以快速定位数据文件中记录位置。数据文件数据文件(有时也称为主文件)通常有三种组织形式:堆组织表(heap-organizedtables,heapfiles)、索引组织表(index-organizedtables)或散列组织表(hash-organizedtables,hashedfiles)。堆组织表(heap-organizedtables),记录不需要遵循任何特定的顺序,大多数情况下它们在文件中按写入顺序排列,当添加新记录时不需要进行任何文件内容的调整。但它需要额外的索引结构指向存储的数据记录的位置,以便进行搜索。索引组织表(Index-OrganizedTable)将索引和数据记录存储在一起。以主键进行排序,二叉树的形式对表的数据进行存储。因为索引组织表已经按照主键对数据进行了排序,查找某个范围记录的效率非常的高。散列组织表(hash-organizedtables)中存储单位是桶(bucket),每个桶中包含若干条记录。主键的散列值决定了一条记录应该存储到的桶。每个桶中的记录可以按添加顺序,也可以按主键排序存储。如果是数据和索引存储在同一个文件中,搜索时可以减少至少一次磁盘寻道,因为遍历索引找到键后既找到了数据记录,不需要再从独立的数据文件中读取数据记录。当数据存储在单独的文件中时,索引文件保存的条目(dataentries)可以识别数据记录,并包含足够的信息来在数据文件中定位该记录。例如,可能包含了数据文件中该记录的偏移量,或者散列文件中的桶ID。如果是索引组织的表,条目保存就是实际的数据记录。索引文件索引是一种能帮助高效磁盘数据检索的数据结构。通常索引具有特殊的数据结构,该结构能映射键到键对应数据记录在数据文件中的位置。主文件(数据文件)上的索引称为主索引。在大多数情况下,主索引构建在主键上,主键可以是一个键也可以是一组能识别记录的键。所有其他索引都称为辅助索引(Secondaryindexes)。辅助索引可以直接映键到数据记录位置,或者只是简单的映射到记录所对应的主键。多个辅助索引可以指向相同的记录,从而允许通过不同的字段和不同的索引来查找单个数据记录。主索引文件为每个搜索键保存唯一一个条目,而次索引可能为每个搜索键保存多个条目。如果数据记录的顺序和搜索键的顺序一致,则此索引称为聚簇索引。这种情况下索引和的数据记录通常存储在相同的文件中。如果数据存储在单独的文件中,并且其顺序和键的顺序不一致,则该索引称非非聚簇索引。在图1-5中,a部分的辅助索引的一个搜索键指向了两个数据记录;b部分的辅助索引通过主键间接的指向数据记录。图1-5许多数据库系统都有自带显式主键对应唯一一条数据库记录。在没有指定主键的情况下,存储引擎可以创建一个隐式主键(如,MySQLInnoDB会添加一个自动递增列)。上面这些术语和概念适用于不同类型的数据库系统:关系数据库系统(如MySQL和PostgreSQL)、基于dynamo的NoSQL数据库(如ApacheCassandra和Riak)和文档存储数据库(如MongoDB)。虽然在具体数据库上命名可能会有一些不同,但多数情况下和上面这些术语一一对应。以主索引为间接层对于辅助索引是直接保存数据记录位置信息,还是保存数据记录的主键从而间接的指向数据记录,数据库社区大家看法不尽相同。事实上这两种方法各有利弊,在具体应用场景下讨论才具有意义。辅助索引直接保存数据记录位置可以减少磁盘查找寻道时间,但是当数据记录更新时或移动时必须要同时更新辅助索引中保存的数据记录位置信息;通过主键的形式间接指向数据记录虽然可以减少索引维护成本,但是由于磁盘读取的原因读取数据记录的成本更高。如果应用中大量的是读操作较少的写操作,更新所有索引保存的数据记录位置信息可能不会有太大的问题。但是,如果应用中大部分都是写操作,每次都要更新所有索引中的位置信息就可能带来比较大的性能开销了。为了减少更新索引中保存的数据记录位置信息带来的开销,一些数据库的实现中通过主键而引入一个间接层,即辅助索引通过指向主键而非直接保存数据记录位置信息。例如,MySQLInnoDB在执行查询时,首先会在辅助索引上查找到主键,然后再通过主索引查询数据记录的位置。这种方式由于不是直接从辅助索引获取到数据记录的位置,因而会增加一次主索引查找的开销。图1-6显示了这两种方法的不同之处:a)主索引和辅助索引都直接保存了数据记录的位置信息;b)辅助索引保存数据记录的主键,通过主索引间接的指向数据记录的位置;图1-6也有同时使用两种两种方式的,数据记录的主键和位置信息都被保存在辅助索引中。如果数据位置信息已经失效的情况下,通过主索引定位数据记录,最后更新辅助索引中失效的位置信息。深入理解数据库系统(储存引擎概述1)


转载请注明:http://www.aierlanlan.com/tzrz/7845.html

  • 上一篇文章:
  •   
  • 下一篇文章: