SQLite:在索引中不使用PRIMARY KEY列

时间:2017-03-07 12:15:01

标签: 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);

两个表中的数据相同:约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,那么我可以对此做些什么建议吗?

1 个答案:

答案 0 :(得分:2)

在最近的SQLite版本中,两个查询都得到了正确的优化,所以显然这是一个(现在修复的)错误。

只需更新您的SQLite。