2009-08-20 35 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的名称。