SSDs是否降低了数据库的实用性?

我今天才听说罗伯特·马丁,他在软件界似乎是一个知名人物,所以我的标题并不是为了吸引点击或者替他说话,而只是根据我有限的经验和理解对他的观点进行解读。 今天我看了一个关于软件架构的视频,由罗伯特·C·马丁发表演讲。在视频的后半部分,数据库成为主要焦点。 根据我的理解,他似乎在说SSD会大大降低数据库的实用性。 我是这样解读的: 他谈到了使用HDD/旋转硬盘时,数据检索速度很慢。然而,现在我们使用SSD,他指出。他开始说“RAM即将来临”,然后继续提到RAM磁盘,但又表示不能称之为RAM磁盘,只能称之为RAM。因此,使用RAM时,我们不需要索引,因为每个字节获取的时间都相同。(这段是我改写的) 所以,他建议用RAM(计算机内存)来替代数据库(我理解他的说法是这样),这是没有意义的,因为这就像是说所有的记录都在应用程序的生命周期中进行内存处理(除非你按需从磁盘文件中读取)。 所以,我想他可能是指SSD而不是RAM。在这种情况下,他是在说SSD降低了数据库的实用性。他甚至说:“如果我是Oracle,我会感到害怕。我存在的根本原因正在消失。” 从我对SSD的一点了解来看,与HDD相比,HDD的寻址时间是O(n)(我认为是这样),而SSD的寻址时间接近O(1),或者几乎是随机的。所以,他的建议对我来说很有趣,因为我从未像他那样思考过这个问题。 几年前,当一位教授描述数据库的好处时,我第一次接触到数据库,我得出的结论是数据库的主要作用实质上是一个高度索引的文件系统(以及优化、缓存、并发访问等),因此,如果SSD中不需要索引,数据库的实用性确实会降低。 不管怎样,我得先说一下我是个新手,我觉得很难相信数据库会变得没那么有用,因为每个人都还是把数据库作为应用程序的主要点,而不是纯粹的文件系统,我觉得他过于简化了数据库的作用。 顺便提一下:我确实看到最后,以确保他没有说错什么。 供参考: 42:22 是整个数据库话题出现的时间点, 43:52 是他开始说“我们为什么需要数据库”的时间点。 这个回答确实说SSD大大加快了数据库的速度。 这个问题问的是优化如何改变。 简单来说,我的问题是,广泛使用服务器市场上的SSD(无论是即将到来还是已经发生)是否减少了数据库的有用性? 似乎演讲者想要表达的是,使用固态硬盘(SSD),可以将数据存储在磁盘上,而不必担心像旧式硬盘驱动器(HDD)那样检索速度慢。因为SSD的搜索时间接近O(1)(我想是这样)。所以,如果这是真的,那么它可能会失去其中一个优势:索引,因为索引用于加快搜索时间的优势将不存在。
4个回答

在使用SSD时,数据库中有一些东西应该进行调整。例如,针对PostgreSQL,您可以调整effective_io_concurrencyrandom_page_cost。然而,更快的读取和更快的随机访问并不是数据库的主要功能。它确保:

他对索引的看法是错误的。如果整个表可以读入内存,索引仍然是有用的。不相信我吗?我们来做一个思想实验。

想象一下,你有一张只有一个索引列的表。 CREATE TABLE foobar ( id text PRIMARY KEY ); 想象一下,这个表中有5亿行数据。 想象一下,这5亿行数据都被连接在一起形成了一个文件。 什么更快, 1. grep '关键词' 文件 2. SELECT * FROM foobar WHERE id = '关键词' 这不仅仅是关于数据所在的位置,还涉及到如何排序以及必须执行哪些操作来找到你要查找的内容。PostgreSQL支持B树、哈希、GiST、SP-GiST、GIN和BRIN索引(通过扩展还支持Bloom)。如果你认为所有这些数学和功能都会因为更快的随机访问而消失,那就太愚蠢了。

32只是一个补充说明 - OP 应该小心不要混淆“随机访问”和“内容寻址访问”。正如 OP 所指出的那样,“随机访问”意味着访问内存中的每个字节的时间复杂度为 O(1)。然而,在这种“随机访问内存”中查找数据仍然需要顺序搜索;也就是说,你不能向内存询问“找到像 这样 的数据”,然后它会神奇地将其交给你。 - Bob Jarvis - Слава Україні
2@BobJarvis 你说得对。你的评论帮助更清楚地解释了 @EvanCarroll 的“什么更快”的例子,说明索引甚至子索引的重要性,并且仅仅在 O(1) 中获取数据并不足以满足数据库提供的用例。 - Honinbo Shusaku

根据你的帖子,清楚的信息是关系型数据库(RDBMS)查找时间的优化正在被硬件取代,从而使IO时间可以忽略不计。 这绝对是真实的。在数据库服务器上使用SSD,结合高内存,极大地缩短了IO等待时间。然而,RDBMS的索引和缓存仍然具有价值,因为即使在拥有这种巨大IO优势的系统中,由于索引不良导致的查询性能差的问题仍然会存在IO瓶颈。这通常只在高负载应用程序或编写不良的应用程序中发现。 对于关系型数据库系统来说,数据一致性、数据可用性和数据聚合是关键价值所在。利用Excel电子表格、CSV文件或其他方法来保存“数据库”并不能提供任何保证。 SSD不能防止由于任何原因(网络、操作系统损坏、停电)导致主服务器不可用。SSD也不能保护您免受糟糕的数据修改。与“仅仅拥有”它们相比,SSD也不能加快运行分析的速度。

虽然我对此有了更深入的了解,但我提问的背景是关于原始SSD数据存储与在带有HDD的数据库上进行数据存储之间的比较,而你的回答是基于在SSD上的数据库(由于我的问题表述不清楚)。 - Honinbo Shusaku
4@Abdul 这个比较就像是苹果和悬索桥之间的对比。一个原始设备可以给你一个大容量的存储空间;而一个数据库则可以让你根据数据模型来组织和访问这个存储空间。Josh在这里的观点是,如果你带着幻想的眼光认为原始固态硬盘很棒,因为它“快”,并且你只需要编写代码来处理所有的数据存储,那么最终你会发现自己不得不编写一个数据库。 - Blrfl

Uncle Bob可能是在谈论像Redis或Gemfire这样的内存数据库。在这些数据库中,数据库中的所有内容都真正包含在RAM中。数据库可以从空白开始,并填充短暂的数据(用作缓存),或者从磁盘加载所有内容,并定期将更改检查点到磁盘。 这种做法越来越受欢迎,因为RAM变得便宜,而且在内存集群数据库中存储一太字节的数据变得可行。有很多使用情况,即使是像SSD这样的快速磁盘,也因为能够立即访问而将其放入RAM中具有价值。如果有意义的话,甚至可以继续使用SQL进行某些操作。 为什么这会让Oracle感到担忧?数据正在增长,关系数据库管理系统(RDBMS)不太可能消失。然而,多年来,Oracle的工程时间大部分用于提高在旋转磁盘上的数据检索速度。现在,Oracle需要适应完全不同的存储层次。他们正在使用Oracle Database In Memory进行适应,但他们面临着与过去不同的竞争。想想花了多少时间来确保查询优化器根据磁盘上的布局选择正确的策略...

啊,我从来不知道还有内存数据库这种东西。 - Honinbo Shusaku
1作为另一个例子,SQLite可以在内存中运行,因此无需使用不同的数据库。 - mmmmmm

社区维基帖子收集最初以问题评论形式提供的答案。
我会说完全相反。由于读写速度非常快,现在你可以使用GPU加速数据库(例如BlazingDBAlenka)更快地进行数值计算。现在你可以更快地运行更复杂的查询。现在可以以合理的速度运行人们甚至不考虑运行的查询。查询越复杂、数据量越大,你就越能受益 - cybernard。 虽然 Bob Martin 已经存在很长时间,而且他的观点通常是值得倾听的(即使不一定同意 :-),但在这种情况下,我认为他陷入了“关系数据库的死亡就在眼前”的人群中(其中我是一个副会员 :-)。在某些有限环境下,非关系型数据库技术可能提供一些有说服力的优势。然而,尽管关系模型可能存在各种问题和缺陷,我个人认为它仍然是当今最好的通用数据库模型。具体情况可能会有所不同。- Bob Jarvis 我们使用数据库的主要原因并不是因为磁盘速度慢(实际上,最初这被认为是不使用数据库的原因之一),而是因为数据很复杂。数据库的主要目的是使多个应用程序/用户能够在受控的方式下找到正确的数据,甚至能够同时对其进行修改。快速实现这一目标只是数据库的次要目标。- RBarryYoung RDBMS不会很快消失;它们是某些类型应用的最佳选择,而NoSQL(如Mongo等)则是其他类型应用的最佳选择。因地制宜。- sh1rts 数据库有助于组织数据。它一开始并不是为了快速访问数据而设计的。- 吉祥