sqlite通过连接两个(或更多)表提高查询速度

sqlite通过连接两个(或更多)表提高查询速度,sqlite,Sqlite,考虑下表 创建表a辅助,删除默认值0,…其他列…;-~30万行 创建表b bid,删除默认值0,aid,…其他列…;-~110万行 创建索引ix\u a\u deleted\u aid deleted,aid WHERE deleted=0; 创建索引ix_b_deleted_bid deleted,bid WHERE deleted=0; 我得到以下查询性能 从已删除=0的列表中选择Countaid;-~300毫秒 从b中选择Countbid,其中deleted=0;-~80毫秒 选择Coun

考虑下表

创建表a辅助,删除默认值0,…其他列…;-~30万行 创建表b bid,删除默认值0,aid,…其他列…;-~110万行 创建索引ix\u a\u deleted\u aid deleted,aid WHERE deleted=0; 创建索引ix_b_deleted_bid deleted,bid WHERE deleted=0; 我得到以下查询性能

从已删除=0的列表中选择Countaid;-~300毫秒 从b中选择Countbid,其中deleted=0;-~80毫秒 选择Countbid 从b连接a到b.aid=a.aid 其中b.deleted=0和a.deleted=0;-~2700ms 如何将最后一个查询加速到前两个查询的顺序

以下是不同查询的查询计划

解释查询计划从b中选择Countbid,其中deleted=0; -使用覆盖索引ix搜索表b_b_deleted_bid deleted=? 解释查询计划从b中选择Countbid在b.aid=a.aid上加入a,其中b.deleted=0和a.deleted=0; -使用索引ix搜索表b_b_deleted_bid deleted=? -使用覆盖索引ix搜索表a_a_deleted_aid deleted=?援助=?
运行并查看查询计划器是否在生成额外统计信息的情况下对联接进行重新排序?不幸的是,没有差异。我认为,由于a的行数较少,因此将其移动到第一个表将有所帮助,除非在查看两个表中的deleted=0行时不是这样。有关如何手动控制顺序的信息,请参见,或者尝试在当前查询中交换两个表。但如果这不起作用,你可能会因为刮胡子而失去运气。连接所涉及的工作比简单的计数要多得多,而且它的速度永远不会这么快。。。