2009-08-20 37 views
1

我在內存數據庫中使用了DBD :: SQLite。我爲表格定義了以下索引:在SQLite3中,這個select語句會從兩個索引中獲益嗎?

CREATE INDEX x ON ss (a, b); 
CREATE INDEX y ON ss (c, d, e, o); 

以下select語句是否會使用這兩個索引?

SELECT f, g 
FROM ss 
WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ? 

而且,我應該只對where子句中的那些列做索引?


我問這只是因爲我想運行最小INDEX更多選擇。

SELECT f, g FROM ss WHERE o = ? 
SELECT f, g FROM ss WHERE a = ? AND b = ? 
SELECT f, g FROM ss WHERE c = ? AND d = ? AND e = ? 
SELECT f, g FROM ss WHERE c = ? AND d = ? AND o = ? 
SELECT f, g FROM ss WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ? 

回答

2

使用EXPLAIN QUERY PLANhttp://sqlite.org/lang_explain.html)查看使用哪些索引。

EXPLAIN QUERY PLAN 
SELECT f, g 
FROM ss 
WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ? 

Reuslt在類似

"0","0","TABLE ss WITH INDEX ..." 
+0

對不起,你的鏈接無效(再更新?)。 – Juergen 2009-08-20 21:50:45

+0

該鏈接是http://sqlite.org/lang_explain.html它似乎被一些逃脫魔術打破。 – wierob 2009-08-20 21:56:11

+0

是的,真正的魔力;-)謝謝! – Juergen 2009-08-20 22:00:38

0

可能是錯的,但給出的SQLite佔地面積小,如果它曾經使用超過1個指數爲每個tablein(子)選擇我會感到非常驚訝。

像ORACLE和DB2這樣的怪物數據庫最近纔開始在每個子查詢中爲每個表使用多個索引,然後很少。

0

正如我所記得的SQLite的文檔太多,SQLite的總是使用只有一個指數。

所以你一定會在這裏失敗。但是,您可以創建一個包含所有相關字段的索引(儘管這可能會爲索引大小創建額外的內存消耗,並會減慢插入和更新速度)。

更正:在最新的文檔中,它表示優化器嘗試使用「至少一個索引」,請參閱optimizer docu。它接縫,它升級了一點 - 但仍然不清楚它何時使用多個指紋。因此,您必須使用「EXPLAIN QUERY PLAN」作爲wierob的名稱。