以前对数据库原理不太了解的时候觉得只要有足够大的内存,能把数据库放到内存里去缓存,那么数据库就和内存数据库性能差不多了。后来随着对数据库原理的了解,发现这个想法是比较肤浅的。因为每次访问延时与磁盘访问延时的巨大差异,导致了内存数据库和磁盘数据库之间存在巨大的差异,仅仅依靠在内存中读取数据是不够的。有人基于PostgreSQL,利用INTEL AEP 傲腾非易失性内存,把傲腾内存做成文件系统,然后把数据库完全存储在海量的傲腾内存中,对比NVME SSD的性能,发现并无太大的提升。这是因为磁盘数据库引擎使用的是比较缓慢的文件IO接口,而内存访问使用memcpy等更为高效的接口。日本NTT的Takashi Menjo的团队HACK了PG的源代码,将数据库访问接口改为内存接口后,同样在AEP的测试环境中,发现PG数据库的性能获得了较大的提升,这个案例我以前的文章中介绍过。
我以前也没有了解过openGauss 内存存储引擎MOT相关的信息,从这种openGauss的架构图上我们可以看出,在数据库存储引擎层存在两种存储引擎,一种是基于磁盘的存储引擎,另外一种是内存优化存储引擎。这两种存储引擎都产生WAL,使用统一的WAL机制和WAL设备进行持久化。
内存数据库的持久化和磁盘数据库的持久化是有巨大的差异的,WAL是内存数据库持久化目前最好的方法。使用统一的WAL,这说明内存优化存储引擎似乎不仅仅是作为缓冲存在的,是一种全功能的内存存储引擎。不过从另外一方面,openGauss的MOT的实现是用插件的方式的,并不是集成在核心代码中,