我在测试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);
两个表中的数据相同:约180000行,其中150000行room='zO'
。
问题是test2
对给定room
和小范围ord
的查询不会使用ord
的{{1}}列:
test2_room_idx
对于150000行,这不是太糟糕,但我的生产数据有数百万行,查询最终需要几秒钟。
我有两张桌子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=?)
。该问题似乎特定于符合ANALYZE
的{{3}}要求的列。
我的问题是:
rowid
的{{1}}列未用于此查询?ord
作为test2_room_idx
,那么我可以对此做些什么建议吗?答案 0 :(得分:2)
在最近的SQLite版本中,两个查询都得到了正确的优化,所以显然这是一个(现在修复的)错误。
只需更新您的SQLite。