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
對於給定room
和ord
個很小的範圍內將不使用的test2_room_idx
的ord
列的查詢:
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這兩個表。該問題似乎特定於與rowid
的INTEGER PRIMARY KEY要求匹配的列。
我的問題是:
- 爲什麼沒有被用於此查詢的
test2_room_idx
的ord
列? - 缺乏重新定義我的生產表沒有
ord
作爲PRIMARY KEY
,我可以做些什麼呢?
我應該考慮檢查一下。事實上,它似乎已經固定在3.11.1和3.12.0之間。 – richvdh