【问题标题】:SQLite3 takes more time to retrieve certain fields for the same indexed querySQLite3 需要更多时间来检索相同索引查询的某些字段
【发布时间】:2022-09-28 02:42:22
【问题描述】:

我正在查询带有索引的表:

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)

我以不同的速度在同一张表上进行 2 次查询:

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

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

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=?)

为什么第二个查询需要这么长时间?我该如何解决?

    标签: performance sqlite


    【解决方案1】:

    感谢您的查询执行时间包括将结果集从 SQLite 发送到任何调用查询的延迟量。如果我们再次比较您的两个查询:

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

    我们可以看到它们的不同之处仅在于第二个查询选择了一个额外的ip 列。我将解释性能差异是由于通过 IP 地址字段发送的额外延迟。

    为了更好地比较两个查询,一般来说,对您的数据库使用EXPLAIN 命令。这只会显示对数据库本身执行查询所需的工作,而忽略网络延迟。

    【讨论】:

    • 一个额外的 INT 字段会导致查询时间增加 40 倍?它只是一个附加参数。差异不应该只是几毫秒吗?
    【解决方案2】:

    在 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 毫秒内执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多