【发布时间】:2018-01-23 20:38:22
【问题描述】:
我在 SQLite 数据库中有一个表 TABLE,其中包含 DATE、GROUP 列。我想选择每组中的前 10 个条目。在 stackoverflow 上研究了类似的主题后,我想出了以下查询,但运行速度非常慢。任何想法如何使它更快?
select * from TABLE as A
where (select count(*) from TABLE as B
where B.DATE < A.DATE and A.GROUP == B.GROUP) < 10
这是 EXPLAIN QUERY PLAN (TABLE = clients_bets) 的结果:
【问题讨论】:
-
显示该查询的表定义和EXPLAIN QUERY PLAN 的输出。
-
@CL 不完全确定表定义是什么意思,但除了 DATE 和 GROUP 之外,它还包含许多 (~50+) 列,DATE 是 TEXT,GROUP 是 INT。我将 EXPLAIN QUERY PLAN 的输出添加到问题中。
-
@JosefOndrej 你有关于 DATE 和 GROUP 的索引吗?为什么数据库必须对内部查询执行 SCAN?您无法避免外部完整扫描,因为您正在在过滤之前询问每一行的运行总计。
-
@PanagiotisKanavos 不,我在这些列上没有任何索引。现在,当我添加它们时,查询所需的时间减少了 10 倍,并且在 EXPLAIN QUERY PLAN 输出中,第三行现在是“SEARCH TABLE clients_bets AS B USING INDEX ...”
标签: sqlite