1
我在SQLite中測試了一些查詢性能,因此查看了查詢計劃等。我碰到了這個(對我來說)有趣的場景,其中select count(*)
列出了索引作爲覆蓋索引,而使用select *
的相同查詢條件使用相同的索引但沒有列出它作爲覆蓋指數。SQLite中爲什麼select count(*)和select * query planning有區別?
有問題的查詢和結果:
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'版本以僅返回Id後自己也達到了相同的實現,這導致它將索引報告爲覆蓋索引。 https://www.sqlite.org/queryplanner.html然後向我解釋了這個概念。 – dlanod