2012-12-06 83 views
0

架構:SQLite拒絕使用更好的索引?

CREATE TABLE [Groups] ([Group] VARCHAR(50) NULL, [ArtNum] INTEGER NULL, [ID] VARCHAR(50) NULL, [Time] INTEGER); 
CREATE INDEX [GroupTime] ON [Groups] ([Group], [Time] DESC); 
CREATE INDEX [GroupArtNum] ON [Groups] ([Group], [ArtNum]); 

我想優化以下查詢:

SELECT `ID` FROM `Groups` WHERE `Group`=? ORDER BY `Time` DESC LIMIT 1 

的問題是,SQLite的關於使用GroupArtNum指數,而不是GroupTime指數的堅持。 EXPLAIN QUERY PLAN打印以下內容:

SEARCH TABLE Groups USING INDEX GroupArtNum (Group=?) (~10 rows) 
USE TEMP B-TREE FOR ORDER BY 

有趣的是,如果我試圖通過ArtNum,而不是Time排序,它運行速度很快。

我在Time列中只有(64位)整數,與ArtNum相同。

+2

您是否嘗試過運行['ANALYZE'](http://www.sqlite.org/lang_analyze.html)? –

+0

如果'ANALYZE'沒有解決這個問題,將'Time'放入查詢*應該會欺騙它。像這樣:WHERE Group =? AND時間> = 0'。然而,可能有更多優雅的解決方案。 –

+0

ANALYZE工作,謝謝!請轉貼爲答案,以便我可以接受它:) –

回答

1
  1. 運行ANALYZE(這可能會或可能不會幫助任何具體情況);或
  2. 使用INDEXED子句使用一個特定的指數(雖然documentation警告不要這樣)強制:

    SELECT ID FROM Groups INDEXED BY GroupTime WHERE ... 
    
  3. 或更新到3.7.15的SQLite(當它被釋放),其中有查詢規劃優化這使得它認識到使用GroupTime更有效。