为什么SQLite不会将我的索引用于order by

时间:2013-03-03 10:25:36

标签: sql sqlite indexing

我的查询:

SELECT *
FROM t1, t2
WHERE (t1.ZID=t2.ZCHARACTERID AND t1.ZID IN (1,2,3,4) AND t2.Z_ENT=3)
ORDER BY t2.ZSTROKECOUNT

我的指数:

CREATE INDEX i1 on t1(ZID);
CREATE INDEX i2 on t2(ZCHARACTERID, Z_ENT, ZSTROKECOUNT);

解释查询计划

selectid    order       from        detail                                                                         
----------  ----------  ----------  -----------------------------------------------------------------  --------------
0           0           1           SEARCH TABLE t1 USING INDEX i1 (ZID=?) (~740 rows)
0           0           0           EXECUTE LIST SUBQUERY 1                                                        
0           1           0           SEARCH TABLE t2 USING INDEX i2 (ZCHARACTERID=? AND Z_ENT=?) (~9 row)
0           0           0           USE TEMP B-TREE FOR ORDER BY    

从解释查询计划的第3行开始,它表示只使用了两个索引列,而temp b-tree用于order by。但据我所知,我也应该能够使用i2作为订单。

我错过了什么吗?感谢。

2 个答案:

答案 0 :(得分:1)

因为您忘记了FROM子句

试试这种方式

   SELECT * FROM your_table WHERE (t1.ZID=t2.ZCHARACTERID AND t1.ZID IN (1,2,3,4) AND t2.Z_ENT=3) ORDER BY t2.ZSTROKECOUNT

答案 1 :(得分:0)

索引未按ZSTROKECOUNT排序。

如果你这样做,SQLite将使用索引进行排序:

DROP INDEX i2;
CREATE INDEX i3 ON t2(ZSTROKECOUNT, ZCHARACTERID, Z_ENT);