我正在查询索引为的表:
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=?)
为什么第二个查询要花这么长时间?我该如何修复它?
2条答案
按热度按时间wrrgggsh1#
请注意,查询执行时间包括从SQLite向调用查询的任何对象发送结果集的延迟时间。如果我们再次比较您的两个查询:
我们可以看到它们的不同之处仅在于第二个查询选择了一个额外的
ip
列。为了更好地比较两个查询,一般来说,对数据库使用
EXPLAIN
命令。这将只显示对数据库本身执行查询所需的工作,而忽略网络延迟。vawmfj5a2#
在SQLite论坛的帮助下我解开了这个谜团。检查查询时间的方法只是将查询的输出发送到/dev/null。在这个特定的例子中,打印到控制台花费了很长时间。
查询在48毫秒内执行,这与预期一致。