我正在测试SQLite中的某些查询性能,因此查看了查询计划等。我遇到了这个(对我)有趣的场景,其中select count(*)
将索引作为覆盖索引列出,而使用select *
的相同查询条件使用相同的查询条件索引,但未将其列出为覆盖索引。
有疑问的查询和结果:
sqlite> explain query plan select count(*) from Table1 cross join Table2 on Table1.Id = Table2.Id and Table1.ExportTime >= Table2.InsertTime;
0|0|0|SCAN TABLE Table1 (~5000 rows)
0|1|1|SEARCH TABLE Table2 USING COVERING INDEX test_2 (Id=? AND InsertTime<?) (~167 rows)
sqlite> explain query plan select * from Table1 cross join Table2 on Table1.Id = Table2.Id and Table1.ExportTime >= Table2.InsertTime;
0|0|0|SCAN TABLE Table1 (~5000 rows)
0|1|1|SEARCH TABLE Table2 USING INDEX test_2 (Id=? AND InsertTime<?) (~167 rows)
为什么会这样呢?
最佳答案
覆盖索引是可用于解析整个查询的索引,因此无需读取表。对于select *
查询,有必要读取表以检索列值。使用select count(*)
,它可以仅通过使用索引来查找结果(计数)。
关于sql - 为什么SQLite中的select count(*)和select *查询计划之间有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20647549/