sqlite - 为什么在内存模式下不要在 sqlite 中加速

标签 sqlite optimization in-memory-database sql-execution-plan

有一个查询全表,有500万条记录,耗时60s左右。如何优化这个?
我曾尝试使用sqlite的内存模式,理论上这应该更快,因为整个数据库都存储在memroy中。但是,它的成本几乎相同。
像这样的表模式:

CREATE TABLE tbl0(estimateid int, seq int,  field1 int NULL, field2 int NULL,  field3 int NULL,  field4 int NULL);
CREATE INDEX tbl0_idx on tbl0(estimateid);
CREATE TABLE tbl1(seq int, companyid int, field1 int NULL, field2 int NULL,  field3 int NULL,  field4 int NULL, field5 int NULL);
CREATE INDEX tbl1_idx on tbl1(seq);
CREATE TABLE tbl2(symbolid int, relatedcompanyid int,  value char(64),  field1 int NULL, field2 int NULL,  field3 int NULL,  field4 int NULL, field5 int NULL);
CREATE INDEX tbl2_idx on tbl2(relatedcompanyid);

这是查询,需要连接 3 个表的查询:
>explain query plan select tbl0.estimateid, tbl1.seq, tbl1.companyid, tbl2.value from tbl0, tbl1, tbl2 where tbl0.seq = tbl1.seq and tbl1.companyid = tbl2.relatedcompanyid;
0|0|1|SCAN TABLE tbl1
0|1|2|SEARCH TABLE tbl2 USING INDEX tbl2_idx (relatedcompanyid=?)
0|2|0|SEARCH TABLE tbl0 USING AUTOMATIC COVERING INDEX (seq=?)

如何加速这个查询?似乎不可避免地会完全扫描一张 table 。每张表包含大约 500 万条记录,这个查询需要很长时间(几分钟)。
当我将 db 放入内存时,使用这个 #sqlite3 :memory:,它对速度没有任何影响。
非常感谢帮助。

最佳答案

一个 全索引扫描 (类型:索引)根据文档是 之后的第二个最差的执行计划全表扫描 ,您选择的。

全表扫描是数据库的资源密集型操作,除非您提高内存、CPU 速度、索引表、减少记录数等,否则幕后没有任何魔法。这就是为什么您没有注意到任何剧烈的当您将所有内容移至内存时,速度会提高。

您应该尽量避免这种情况并进行更好的查询,或者优化数据库和表结构。请引用 EXPLAIN QUERY PLANQuery Planning获取有关 SQL 执行以及如何优化它的更多详细信息。

很难说更多更具体,因为在您的原始问题中,您没有提供数据库结构、数据特征、查询等。

关于sqlite - 为什么在内存模式下不要在 sqlite 中加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38260980/

相关文章:

android - android更改cursoradapter中的光标位置以增加或减少行

optimization - 最佳固定矩形区域适合点

database - redis 每秒可以在单个键值对上执行数百个事务吗

mysql - 如何使 sqlite 内存数据库连接查询与 MySQL 一样快

java - 如何在Android Studio中从SQLite检索图像

sql - 在dplyr中用转换后的数据替换SQL数据库表

android - 将数据库架构从SQL Server 2008复制到SQLite

mysql - 在mysql中将纬度/经度存储为整数有什么缺点?

algorithm - 课表组合的遗传算法

sqlite:如何在内存中使用