首页 > 解决方案 > 提高 SQLite 查询时间,两个表有外键

问题描述

我有两个表, RX_PACKETS_TABLE (T1), RX_EVENTS_TABLE (T2) 。两者都有 idx。T2 也有 T1 idx 的外键。CREATE TABLE RX_PACKETS_TABLE ( p_idx integer 默认 0, 约束 pk_RX_PACKETS_TABLE 主键 (p_idx) )

CREATE TABLE RX_EVENTS_TABLE ( e_idx integer default 0, , p_idx integer default 0, constraint pk_RX_EVENTS_TABLE 主键 (e_idx) )

T2 行相对于 idx 和外键按升序排序。例如,T2 可以存储这些行:e_idx, p_idx 1, 1 2, 1 3, 2 4, 3 4, 4...

T2 大小约为(T1 大小)X 5。系统在资源有限的硬件上运行。我做了一些实验,当 T1 有 500K 行时,获取最后 100 个连接行需要太多时间。

我使用了不同的查询,一种使用 JOIN 操作,一种使用检查子查询的“in”条件,两者都给出了大致相同的结果。我理解的问题是 SQLite 引擎没有利用 T2 已排序的事实,也没有优化“IN”条件的 JOIN/测试。因此,他根据 JOIN/"IN" 条件检查 T2 的每一行。

如果我只获取 T2 的最后 100 行,则查询时间会显着下降(1 毫秒 VS 1000 毫秒)。我想了两个解决我的问题的方法:1.在将数据写入数据库之前缓冲数据并将其分组。这会给数据库中可用的数据增加一些延迟,但这不是很重要。2. 编写更好的查询并以某种方式利用 T2 按两个字段排序的事实,但我不知道该怎么做。

你怎么看?

标签: sqlitejointime

解决方案


我的一个朋友建议在 T2 的 p_idx 字段上创建一个索引。完成之后,查询时间从大约 1700 毫秒显着下降到 1 毫秒。


推荐阅读