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万条记录,这个查询需要很长的时间(几分钟)。 当我将数据库放入内存时,使用这个#sqlite3 :memory:,它对速度没有任何影响。 非常感谢帮助。

最佳答案

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

全表扫描对于数据库来说是资源密集型操作,除非您提高内存、CPU 速度、对表建立索引、减少记录数量等,否则幕后并没有什么魔力。这就是为什么您没有这样做当您将所有内容移至内存时,注意到速度急剧增加。

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

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

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

相关文章:

c# - 将 SQLite Blob 转换为十六进制再转换为字符串

php - 在脏话表中搜索单词,所有单词都会被标记

java - 简单可靠的内存数据库,用于快速 Java 集成测试,支持 JPA

java - 如何将 HSQLdb 与 Ibatis 结合使用

c++ - C++ 中的 SQLite SELECT JOIN 和 VIEWS

python - 正确选择由字典组成的数据库

php - 为PHP更新SQLite的PDO驱动程序

python - 在 for 循环中使用 continue 时出现 Numba "Use of unsupported opcode (CONTINUE_LOOP) found"错误

c++ - 为什么 std::map 使我的代码如此臃肿?

apache-spark - Tachyon 默认情况下是否由 Apache Spark 中的 RDD 实现?