2013-12-18 60 views
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) 

爲什麼會出現這種情況?

回答

3

覆蓋索引是一個索引,可用於解析整個查詢,使其不需要讀取表。通過select *查詢,需要讀取表來檢索列值。通過select count(*),它可以單獨使用索引找到結果(計數)。

+0

謝謝,覆蓋索引解釋是我錯過的信息。我在調整'select'版本以僅返回Id後自己也達到了相同的實現,這導致它將索引報告爲覆蓋索引。 https://www.sqlite.org/queryplanner.html然後向我解釋了這個概念。 – dlanod

相關問題