3

PRIMARY KEY(col1, col2)

创建一个名为“sqlite_autoindex_mytable_1”的索引。我在“SQlite 专家”中看到了它。在“要索引的字段”框中,它同时显示 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 索引吗?

4

2 回答 2

6
  • 在 SQLite 中,连接被实现为嵌套循环连接,即 SQLite 遍历一个表的所有(可能已过滤)记录,并为每一个记录在另一个表中查找匹配的记录。两个连接表中的哪一个被选为外部表或内部表取决于估计哪个查找更快。
  • 在查询中,SQLite 每个表最多使用一个索引。
  • 仅当使用了所有最左侧的列时,才可以使用多列索引对其列的子集进行查找。例如,您的col1,col2索引可用于同时使用col1col2的查找,或用于仅使用 的查找col1

在您的第一个查询中,两列索引不能用于查找col2. 如果id另一个表的列有索引,SQLite 只会将该表用作循环的内表。如果id也没有被索引,SQLite 很可能会为此查询创建一个临时索引。

在您的第二个查询中,SQLite 很可能t1用作外部表,因为WHERE过滤器将减少必须在另一个表中查找的记录数。两列索引可用于先搜索匹配col1记录;然后这些记录中的每一个都与t2.

要检查查询使用了哪些索引(如果有),请执行EXPLAIN QUERY PLAN

于 2013-10-16T10:45:59.860 回答
1

您最好始终在所需列上创建显式索引。

复合索引可能会加快单列搜索,但必须满足要求!

于 2013-10-16T08:09:33.520 回答