2017-03-07 94 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