【发布时间】:2020-07-13 07:03:54
【问题描述】:
我的 sqlite 数据库 t1 和 t2 中有两个表。 t1 有两列 a 和 b。 t2 有一列与 t1 中的相同。我已经为两个表中的每一列都建立了索引。我想从表 t1 中选择所有行,其中 t1.a 存在于表 t2 中。所以我写了一个查询:
select t1.a, t1.b from t1 where t1.a in(select t2.a from t2) limit 10000000;
我使用限制来选择所有行,而不是前 100 行。
表 t1 包含 6 000 000 行,表 t2 包含 100 000 行。此查询执行 1400 毫秒。
但是当我尝试使用此查询仅选择 t1.a 时:
select t1.a from t1 where t1.a in(select t2.a from t2) limit 10000000;
只用了 86 毫秒。
解释查询计划:
SEARCH TABLE csv USING COVERING INDEX iin_idx (iin=?)
USING INDEX sqlite_autoindex_input_1 FOR IN-OPERATOR
问题:
- 为什么 sqlite 会这样?
- 选择一列或多列有什么区别?
- 是否可以加快查询速度?
- 为什么 sqlite 使用自动索引而不是创建一个?
我想用 155 000 000 行填充 t1 表,因此查询时间会显着增加。
【问题讨论】:
-
您不需要 LIMIT 来选择所有行。
-
显然您正在使用 CSV 文件? b列包含什么?它比 a 包含的列大得多吗?
-
您是否按顺序运行了一次查询?如果是这样,请再次尝试第一个。它可能只是磁盘缓存。
-
请创建一个minimal reproducible example,让我们能够观察到相同的行为。
-
@mkrieger1 否,a 列是 12 个符号,b 列是 11 个符号。