Memory - Versus Disk-Based DBMS
数据库系统将数据存储在内存以及磁盘中,In-memory database management systems
内存式数据库管理系统 (有时也称为主存式数据库管理系统) 主要将数据存储于内存中,然后使用磁盘来作为恢复及日志记录的支持。Disk-based
基于磁盘的数据库管理系统则将大部分的数据保存在磁盘中,然后使用内存来缓存磁盘中的及一些临时性的数据。两种类型的数据库都会使用磁盘来作为重要的扩展,只是内存性数据库只会将数据存储在内存中。
内存的访问速度相较于对磁盘的访问速度,至今仍然要快出几个数量级。因此使用内存作为主要的存储介质是非常有吸引力的,并且随着内存价格的下降这样做具有了更高的经济可行性。然而,内存的价格相对于类似 SSD 跟 HDD 这些持久化介质来说仍然是比较高昂的。
内存数据库系统跟基于磁盘的数据库不仅仅是其主要的存储介质有所不同,还包括了如实现的数据结构、数据组织跟具体的优化技术等等区别。
数据库使用内存作为主要存储截止主要是为了性能、相对较低的访问开销及粒度。而且对内存的操作相对于磁盘也是简易了许多。操作系统所抽象的内存管理机制允许我们自如的控制对任意内存大小进行分配跟释放。在磁盘中,我们需要手动的去管理数据间的引用,序列化的格式,被释放的内存跟碎片等问题。
内存数据库数据增长的主要的限制因素是内存的不稳定性 (换句话说就是较弱的可靠性) 以及花费的成本。因为内存中的数据是非持久化的,所以软件的错误、崩溃、硬件的失效或是电源的切断都会导致数据丢失。当然也有许多办法来确保可靠性,比如提供不会中断的电源跟有备用电池的内存,但这又会导致额外的硬件资源跟操作要求。在实际实践中,这些都不会发生,主要还是归因于磁盘更容易进行管理以及拥有更低廉的价格。
但随着高可用跟更流行的 Non-Volatile Memory
(NVM) 的发展,这个情形似乎会发生转变。NVM 存储能够减少或是消除 (依赖一些其他的技术) 读写延迟间的不对称性,提供更高的读写性能,以及允许使用内存寻址的方式来访问。
Durability in Memory-Based Stores
内存数据库系统使用磁盘进行备份来提供可靠性跟防止数据的丢失。有一些数据库则选择只将数据存储在内存中,并不做任何可靠性的保证,但是这类的数据库我们并不会在本书内进行讨论。
在可以确保操作完成之前,会先将其写入到顺序的日志文件中,我们将会在 Recovery
章节中来讨论 Write-ahead Log
预写日志。为了防止在数据库启动或是崩溃后需要回放所有的操作日志,内存数据库会管理一份数据备份。这份数据备份会以有序的基于磁盘的数据结构进行管理,并且对这个数据结构的操作一般都是异步的 (是与客户端请求分离的) 批量提交,用来减少 I/O 操作。在需要的时候,数据库的内容就可以从这个备份跟日志进行恢复了。
日志的记录通常会批量的应用到备份数据上,在日志处理完之后,备份数据就成了数据库某个时刻的快照,这时在这个时刻之前的日志就可以被丢弃了。这个操作称作 checkpointing
检查点。他能够减少恢复的时间,让数据库通过日志保持在足够新的状态,以便客户端无需在更新备份数据时被堵塞。
不能说内存数据库等同于具有巨大页面缓存的磁盘数据库。尽管页面会被缓存在内存中,但序列化格式、数据的布局都会增加磁盘数据库的开销,这些开销无法跟内存存储中所达到的优化程度做对比。
基于磁盘的数据库使用了特殊的为磁盘访问做了优化的存储数据结构。在内存中,可以对指针快速的进行跟踪,而且内存的随机访问要远远比磁盘的随机访问要快,基于磁盘的存储数据结构通常会使用较宽并且较低的树结构,因为基于内存的实现可以从一个很大的池中获取所需的数据结构并做出各种优化,但这些在基于磁盘的实现中基本上是不可能做到的。同样的,在磁盘上处理可变长度的数据需要特别注意,而在内存中他可能只是从指针中获取一个值。
在某些场景中,确认整个数据集是否能够放进内存中是有意义的。有些数据集受真实世界的限制可能只有少量 KB 的数据跟数据条目的限制。比如学校中的学生记录、大企业中的客户记录或在线商城的存货量。