【发布时间】:2026-02-07 01:35:01
【问题描述】:
有一个查询全表,有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=?)
如何加速这个查询?似乎不可避免地会完全扫描一张桌子。每张表包含大约 500 万条记录,这个查询需要很长时间(几分钟)。 当我将 db 放入内存时,使用这个 #sqlite3 :memory:,它对速度没有任何影响。 非常感谢帮助。
【问题讨论】:
-
为了优化这一点,不要扫描 500 万条记录。
标签: sqlite optimization in-memory-database sql-execution-plan