我在内存数据库中使用DBD :: SQLite。我为表定义了以下索引:
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。
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 = ?
答案 0 :(得分:2)
使用EXPLAIN QUERY PLAN(http://sqlite.org/lang_explain.html)查看使用了哪些索引。
EXPLAIN QUERY PLAN
SELECT f, g
FROM ss
WHERE a = ? AND b = ? AND c = ? AND d = ? AND e = ?
结果类似
"0","0","TABLE ss WITH INDEX ..."
答案 1 :(得分:0)
可能是错的,但考虑到sqlite的占用空间很小,如果它在(子)Select中为每个表使用了多于1个索引,我会非常惊讶。
像ORACLE和DB2这样的怪物数据库最近才开始每个子选择使用每个表多个索引,然后很少。
答案 2 :(得分:0)
尽管我记得SQLite文档,但SQLite始终只使用 一个索引。
所以你一定会在这里失败。但是您可以创建一个包含所有相关字段的索引(尽管这可能会为索引大小创建额外的内存消耗,并会降低插入和更新速度)。
更正:在最新的文档中,它说优化器尝试使用“至少一个索引”,请参阅optimizer docu。它接缝,它升级了一点 - 但它仍然不清楚它何时使用多个indizes。所以你必须使用“EXPLAIN QUERY PLAN”作为wierob的状态。