您的位置  > 互联网

内存数据库和大缓存的MySQL有没有区别?

01

创建终极软件调用堆栈

说到内存数据库,第一个经典问题就是:内存数据库和大缓存MySQL有什么区别吗?

《OLTP the Glass, and What We Found There》一文很好地回答了这个问题。 文章基于一个非常大的系统(保证所有数据都可以存储在内存中,这样就没有换入换出的开销),分析并给出了文中各个系统组件的软件调用栈开销。 从图中我们可以看到,系统实际的读写开销仅占总开销的12.3%。

传统磁盘数据库的成本瓶颈主要是磁盘IO。 基于大缓存的磁盘数据库无法获得良好的CPU利用率,大部分时间都花在B树搜索上。

内存数据库基于极限优化方法,保证调用栈尽可能最优。 例如:

:并发控制协议

对于多核/众核机器来说,可扩展性能尤为重要。 这群博主还发表了一系列的文章分析。 业内比较有代表性的评测论文有三篇。

进入深渊:一个核心

一个 In-Multi-

1000 个核心的故事:真正的大型多核故事。

:索引树结构

ART、HOT 和 Hash 等结构是为内存数据库设计的。 对于指标的分析,之前已经做了一系列的分析。

:恢复模块

对于单机恢复来说,主要关注日志、检查点、回放等问题。 这部分是内存数据库唯一的IO组件。 如何打造非阻塞IO以及极致的下载和加载速度也是一个很大的挑战。

顺便说一句,日志的概念现在在云环境中非常流行。

:大(驱逐)

当数据集超出机器内存时,必须进行数据换入换出。 比较经典的就是内存地址与磁盘介质地址的转换技术:。 下图显示了操作系统交换和基于大型磁盘的数据库之间的性能比较。 可以发现,在小数据集下,内存数据库的性能还不错。 然而,在大数据集下,当发生换入换出时,自我管理性能优于操作系统管理性能。

(来源:G. 等人,In-for Big Data,VLDB,2014 年)

对于需要换入换出的设计,有Anti-、Umbra等。

以上四个主题是内存数据库存储引擎优化的四个要点。 此外,工程实践对于构建最终的软件堆栈也尤为重要。 CPU 时间有时花在等待磁盘和网络上。 这时,异步化和协程化也是非常重要的工程方法。

总之,优化软件栈的理念必须深入骨髓! ! !

02

空间管理

我想分四个部分来解释和理解空间管理。

寻址系统:无论是内存还是磁盘块管理。 空间管理需要一个地址系统来管理。 比如数据库表的page id、page id等都有一套基于寻址的管理。 当然,也有类似free list的设计。 另外,多线程/多进程会共享分配和释放的空间资源,涉及到()问题。

内存编程与磁盘寻址:磁盘地址通常保持不变,而内存地址在重新启动后会发生变化。 了解技术。

主动删除:在多线程环境下,不能立即执行删除,因为这部分数据还可能被其他线程访问,需要延迟删除动作。

被动过期:由于版本多等原因,内存()和磁盘(日志)数据都会过期。 这部分数据需要系统定期清理。

关于主动删除和被动过期,最近有一篇论文可以关注:《is a : and Data in》

往期相关文章回顾: