2013-03-03 64 views
1

我的查詢:爲什麼不使用的SQLite我的索引,以便通過

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行的解釋查詢計劃,它表示只使用了兩個索引列,並使用臨時B樹來排序。但根據我的理解,我應該也可以使用i2進行訂購。

我錯過了什麼嗎?謝謝。

回答

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 
0

指數不ZSTROKECOUNT排序。

的SQLite將使用索引進行排序,如果你這樣做:

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

這是不使用的WHERE? – cellige 2015-07-22 09:28:08

+0

@cellige'i3'用於掃描表,因此沒有單獨的WHERE查找完成。 – 2015-07-22 09:47:20

+0

我明白了,他們已經在整理,但我會認爲它可以跳過,因爲它也一樣? 此查詢我發瘋 SELECT Child.lastModifiedDate,Child.path 從文件夾中兒童 JOIN文件夾名家長Child.folderId = Parent.id WHERE Parent.path = '' 和Child.name>' ORDER BY Child.name,Child.path 我試過INDEXED BY的兩個FROMS的每一個組合,並不能讓它不使用TEMP BTREE,任何想法? – cellige 2015-07-22 10:13:24