PRIMARY KEY(col1, col2)
创建一个名为“sqlite_autoindex_mytable_1”的索引。我在“SQlite Expert”中看到了它。在“要索引的字段”框中,它显示col1和col2。
在这篇文章中: https://dba.stackexchange.com/a/14260 它说如果我想在没有col1的JOIN查询中使用col2,我必须为col2创建单独的索引。
所以我需要添加:
CREATE INDEX "myidx" ON "mytable"("col2");
如果我有这个问题:
SELECT t2.* FROM mytable as t1
INNER JOIN mytable2 as t2 ON t1.col2 = t2.id
我还需要col2索引吗?我没有在其中使用col1
。
这个查询怎么样:
SELECT t2.* FROM mytable as t1
INNER JOIN mytable2 as t2 ON t1.col2 = t2.id WHERE t1.col1 = x
这里我使用的是col1,但在where子句中。它还需要col2索引吗?
答案 0 :(得分:4)
col1,col2
索引可用于同时使用col1
和col2
的查找,也可用于仅使用col1
的查找。在第一个查询中,双列索引不能用于col2
上的查找。
如果另一个表的列id
具有索引,则SQLite将仅使用该表作为循环的内部表。如果id
未编入索引,则SQLite可能会为此查询创建临时索引。
在第二个查询中,SQLite可能会使用t1
作为外部表,因为WHERE
过滤器将减少必须在另一个表中查找的记录数。两列索引可用于首先搜索匹配的col1
记录;然后,每个记录都与t2
加入。
要检查查询使用的索引(如果有),请执行EXPLAIN QUERY PLAN。
答案 1 :(得分:1)
您最好始终在所需列上创建显式索引。复合索引可以加快单列搜索,但必须满足requirements!