database - 尝试选择多行时,Sqlite Select 行为缓慢
问题描述
我的 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 表,因此查询时间会显着增加。
解决方案
推荐阅读
- javascript - 使用 Jest 运行 Puppeteer 测试时如何增加导航超时
- concourse - Concourse CI 任务输出存储在哪里
- java - 使用 Jenkins Deploy 插件部署到 Tomcat 而不删除上下文 xml 文件
- php - 是否有一种有效的方法可以在 php 中较大的正则表达式替换中运行子正则表达式替换语句
- jenkins - Windows服务安装方法我们如何配置没有端口号的jenkins url?
- java - 找到 java.lang.NoClassDefFoundError 的真正原因
- javascript - 安装引导程序后,我的本地 css 模块不再加载到 webpack 中
- ajax - 将 ajax 与 selectPDF 一起使用
- java - Java Stream 接口映射函数参数类型
- php - 如何让我的按钮在页面的底部显示 href?