2017-03-07 63 views
1

不使用PRIMARY KEY列我有在測試SQLite數據庫以下表:SQLite的:在索引

CREATE TABLE "test" (ord INTEGER, room TEXT NOT NULL); 
CREATE INDEX test_room_idx on test(room, ord); 

CREATE TABLE "test2" (ord INTEGER PRIMARY KEY, room TEXT NOT NULL); 
CREATE INDEX test2_room_idx on test2(room, ord); 

的數據在兩個表中是相同的:約18萬行,其中有150000 room='zO'

的問題是,在test2對於給定roomord個很小的範圍內將不使用的test2_room_idxord列的查詢:

sqlite> explain query plan SELECT * FROM test WHERE room = 'zO' AND ord between 500000 and 501000; 
selectid order  from  detail                   
---------- ---------- ---------- --------------------------------------------------------------------------------- 
0   0   0   SEARCH TABLE test USING COVERING INDEX test_room_idx (room=? AND ord>? AND ord<?) 
sqlite> explain query plan SELECT * FROM test2 WHERE room = 'zO' AND ord between 500000 and 501000; 
selectid order  from  detail               
---------- ---------- ---------- --------------------------------------------------------------- 
0   0   0   SEARCH TABLE test2 USING COVERING INDEX test2_room_idx (room=?) 

爲15萬行,這是不是太糟糕,但是我的生產數據有數百萬行,並且查詢最終需要幾秒鐘的時間。

我有ANALYZE d這兩個表。該問題似乎特定於與rowidINTEGER PRIMARY KEY要求匹配的列。

我的問題是:

  • 爲什麼沒有被用於此查詢的test2_room_idxord列?
  • 缺乏重新定義我的生產表沒有ord作爲PRIMARY KEY,我可以做些什麼呢?

回答

2

在最近的SQLite版本中,兩個查詢都被正確地優化了,所以顯然這是一個(現在已修復的)錯誤。

只需更新您的SQLite。

+0

我應該考慮檢查一下。事實上,它似乎已經固定在3.11.1和3.12.0之間。 – richvdh