我的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问题:
我想用155000行填充t1表,这样查询时间就会显著增加。
发布于 2020-07-13 07:55:52
我想我找到了解决办法!我创建了一个额外的索引:
create index if not exists ab_b_idx on t1(a, b);之后,选择a列和b列的速度与只选择一列一样快。
我在文档覆盖指数中找到了对这种行为的解释
但是,如果从表中提取的所有列都已在索引本身中可用,SQLite将使用索引中包含的值,并且永远不会查找原始表行。这样可以为每一行保存一个二进制搜索,并且可以使许多查询的运行速度提高一倍。
更新:在表t1中搜索10万行花费了550 on。
https://stackoverflow.com/questions/62870786
复制相似问题