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