我今天从一本关于SQLite的书上读到了关键字":Memory:",但它只说明了它是什么,如何使用,并且解释太简短了.所以我在这里搜索了更多信息,但没有获得SQLite的具体信息.

  1. ":memory:"模式有什么优势?(我什么时候需要这个?)

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

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

推荐答案

SQLite in-memory database的主要优势是性能:它将整个数据库保留在内存中,而不是读写磁盘.内存比磁盘快得多.旋转磁盘或IO负载较重的服务器的性能提升幅度最大,而固态硬盘的性能提升幅度较小.

但是,这并不是编写糟糕的查询和表的灵丹妙药.在使用内存数据库来提高性能之前,请确保优化表设计、查询和索引.

主要缺点是一旦进程关闭,数据库就消失了.并且数据库不能大于可用内存.

提交可能会更快,因为不需要写入磁盘,所以自动提交模式可能会更快,但事务仍应用于数据完整性目的.

请注意,不会变得太大的临时SQLite数据库可能会存储在内存中.

由于它的缺点,并且因为您的内存比存储少得多,所以在提交到内存中数据库之前,请try 使用临时数据库.这是通过使用''作为数据库文件名来实现的.这将写入临时文件,但会将工作缓冲到内存缓存中.这是两全其美的,您可以在不使用太多内存的情况下提高性能.

尽管 for each 临时数据库分配了一个磁盘文件,但实际上临时数据库通常驻留在内存分页缓存中,因此由":Memory:"创建的纯内存数据库和由空文件名创建的临时数据库之间的差别很小.唯一的区别是":Memory:"数据库必须始终保留在内存中,而如果数据库变大或SQLite遇到内存压力,则临时数据库的部分内容可能会刷新到磁盘.

分析和基准测试您的应用程序以确保它将导致性能提高,考虑是否更好地优化您的查询并添加索引,并确保您的数据消失也没有问题.

Database相关问答推荐

Golang Gorm和Gin无法创建具有关联的对象

如何将使用模块创建的 Redis RDB 文件迁移到没有该模块的部署? (RedisStack 版本 7.2+ 中不再包含 RedisGraph)

如何在保持相同 Flyway 校验和的同时更正语法?

如何使用用户定义的字符串索引数据框?

哪个能够存储 1 亿条记录的嵌入式数据库具有高效的 C 或 C++ API

如何以编程方式在 C# 中创建 Microsoft Access 数据库?

MongoDB 单文档大小限制为 16MB

复制 MySQL 数据库的最简单方法?

只用一个 save() 插入多行

C# 连接到数据库并列出数据库

内存数据库和磁盘内存数据库的区别

单父实体的核心数据性能

从数据库行在 Golang 中创建map

一个 Linq to Sql - 多个 .DBML 文件或一个 .DBML 文件

SQL - 如何转置?

限制 SQL JOIN

postgreSQL 同时将列类型从 int 更改为 bigint

SQL全文搜索与LIKE

如何在数据库中表示树状 struct

如何判断我的 heroku 数据库的记录?