sqlite中的复合主键

时间:2013-10-15 15:12:40

标签: sql sqlite primary-key composite-primary-key

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索引吗?

2 个答案:

答案 0 :(得分:4)

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

在第一个查询中,双列索引不能用于col2上的查找。 如果另一个表的列id具有索引,则SQLite将仅使用该表作为循环的内部表。如果id未编入索引,则SQLite可能会为此查询创建临时索引。

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

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

答案 1 :(得分:1)

您最好始终在所需列上创建显式索引。复合索引可以加快单列搜索,但必须满足requirements