SQLite中内存数据库的优点

24

今天我在一本有关SQLite的书中看到了":memory:"这个关键字,但是它只是说了这是什么以及如何使用,解释太简短了。于是我在这里搜索更多信息,但无法获得特定于SQLite的信息。

  1. ':memory:'模式有哪些优势?(何时需要使用?)

  2. 内存数据库的性能更快吗?

  3. 在内存数据库上是否仍需要使用事务?


2
主要优势是性能。当与数据库的连接关闭时,它会自动消失。请参考https://dev59.com/R3RA5IYBdhLWcg3wuAcp。 - Dijkgraaf
谢谢,但我已经阅读了该线程,对性能不是很清楚。我还阅读了一些关于其他DBMS(如MySQL)的线程,这些线程说临时数据库并不更快。这就是为什么我在这里提问的原因。 - Jenix
2
“临时数据库/表”和“内存数据库”之间有区别。临时数据库/表仍然可以在磁盘上,而内存数据库则不同。” - Dijkgraaf
我不知道,谢谢!那么你说的是对的吗?更快的性能? - Jenix
不一定更快:https://dev59.com/aHRA5IYBdhLWcg3w9y10 个人经验可能有所不同 - CAD bloke
1个回答

48
一个SQLite内存数据库的主要优点是性能:它不需要读取和写入磁盘,而是将整个数据库保存在内存中。内存比磁盘快得多。当使用旋转硬盘或IO负载较重的服务器时,你会看到最大的性能提升,而使用固态硬盘则提升较小。
然而,这并不能解决糟糕查询和表格的问题。在选择内存数据库以提高性能之前,请确保优化表格设计、查询和索引。
主要的缺点是一旦进程关闭,数据库就不存在了。而且数据库大小不能超过可用内存。
由于不需要写入磁盘,提交可能会更快,因此自动提交模式可能更快,但为了数据完整性仍应使用事务。
请注意,一个不会变得太大的临时SQLite数据库可能会被存储在内存中。
因为有其缺点,并且由于内存比存储器少得多,所以在采用内存数据库之前尝试使用临时数据库。使用''作为数据库文件名即可。这将写入一个临时文件,但在内存缓存中缓冲工作。这是两全其美的最佳选择,你可以获得改进的性能而不会使用太多内存。
尽管为每个临时数据库分配了磁盘文件,但在实践中,临时数据库通常驻留在内存页面高速缓存中,因此仅使用空文件名创建的临时数据库和由":memory:"创建的纯内存数据库之间几乎没有区别。唯一的区别是":memory:"数据库必须始终保留在内存中,而如果数据库变大或SQLite遇到内存压力,则可能将临时数据库的某些部分刷新到磁盘上。

对您的应用程序进行配置文件和基准测试,以确保它会导致性能提升,同时考虑是否更好地优化查询并添加索引,并确保如果数据消失也没有问题。

哇,谢谢!您能回答第三个问题吗?我总是使用事务来提高性能,这对于使用内存数据库也有帮助吗? - Jenix
3
不论性能如何,为了数据完整性,你应该始终使用事务。 - Schwern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接