gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:36:47 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com