SQLite3需要更多的时间来检索同一索引查询的某些字段

qfe3c7zg  于 2022-11-24  发布在  SQLite
关注(0)|答案(2)|浏览(175)

我正在查询索引为的表:

CREATE TABLE hwmd (cycle INT NOT NULL, id INT NOT NULL, ip INT NOT NULL, name CHAR(20) NOT NULL, uid INT NOT NULL, bin INT NOT NULL, num_data INT NOT NULL, task INT NOT NULL, utid INT NOT NULL, term_op INT NOT NULL, context INT NOT NULL);

CREATE INDEX idx_hwmd_id ON hwmd (id)

我在同一个表上进行了两个查询,但查询的速度有很大的不同:

SELECT cycle, id FROM hwmd WHERE id = 100; // 38ms
SELECT cycle, id, ip FROM hwmd WHERE id = 100; // 1089ms

包含ip(INT字段)的第二个查询需要1089ms,而第一个查询仅需要38ms。我确认这两个查询使用相同的索引:

sqlite> explain query plan SELECT cycle, id FROM hwmd WHERE id = 100; 
QUERY PLAN
`--SEARCH hwmd USING INDEX idx_hwmd_id (id=?)

sqlite> explain query plan SELECT cycle, id, ip FROM hwmd WHERE id = 100; 
QUERY PLAN
`--SEARCH hwmd USING INDEX idx_hwmd_id (id=?)

为什么第二个查询要花这么长时间?我该如何修复它?

wrrgggsh

wrrgggsh1#

请注意,查询执行时间包括从SQLite向调用查询的任何对象发送结果集的延迟时间。如果我们再次比较您的两个查询:

SELECT cycle, id FROM hwmd WHERE id = 100;     -- 38ms
SELECT cycle, id, ip FROM hwmd WHERE id = 100; -- 1089ms

我们可以看到它们的不同之处仅在于第二个查询选择了一个额外的ip列。
为了更好地比较两个查询,一般来说,对数据库使用EXPLAIN命令。这将只显示对数据库本身执行查询所需的工作,而忽略网络延迟。

vawmfj5a

vawmfj5a2#

在SQLite论坛的帮助下我解开了这个谜团。检查查询时间的方法只是将查询的输出发送到/dev/null。在这个特定的例子中,打印到控制台花费了很长时间。

sqlite> .once /dev/null
sqlite> select * from hwmd where id = 100;
Run Time: real 0.048 user 0.032339 sys 0.015133

查询在48毫秒内执行,这与预期一致。

相关问题