sql - 为什么SQLite中的select count(*)和select *查询计划之间有区别?

标签 sql sqlite

我正在测试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/

相关文章:

sql - 左外部联接查询中的更正可以使用多个条件

Mysql左连接获取唯一主题

sqlite - sqlite_master 中的 name 和 tbl_name 有什么区别?

sqlite - 如何定期将内存中的sqlite保存到磁盘

ruby-on-rails - 来自 ActiveRecord 关联的查询结果的自定义排序

sql - 在 T-SQL 中对两列进行外连接并跳过 Null

SQL Server : Function Evaluation Time

mysql - 合并 2 个 MySQL 查询并按时间戳排序结果

sqlite3 正在截断/截断/截断我的文本列

将 sqlite 数据库发送到服务器的 Android 实用程序