【问题标题】:Composite primary keys in sqlitesqlite中的复合主键
【发布时间】:2013-10-23 11:17:57
【问题描述】:

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

【问题讨论】:

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


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

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

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

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

    【讨论】:

      【解决方案2】:

      你最好总是在需要的列上创建一个显式索引。

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

      【讨论】:

      • 您没有回答是否需要索引。至少提到EXPLAIN QUERY PLAN
      • @CL。看起来更好查询,我也不确定!你能自己写答案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2015-04-27
      • 2013-06-07
      • 2020-03-28
      相关资源
      最近更新 更多