sql - sqlite中的复合主键

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

主键(col1, col2)

创建一个名为“sqlite_autoindex_mytable_1”的索引。我在《SQlite Expert》中看到过。在“要索引的字段”框中,它显示了 col1 和 col2。

在这篇文章中: https://dba.stackexchange.com/a/14260 它说如果我想在没有 col1 的 JOIN 查询中使用 col2,我必须为 col2 创建单独的索引。

所以我需要添加:

在“mytable”(“col2”)上创建索引“myidx”;

如果我有这样的查询:

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

最佳答案

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

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

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

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

关于sql - sqlite中的复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19384837/

相关文章:

sql - SQL中分组时间序列的最小值和最大值

mysql - 在 MySQL 中管理分层数据

mysql - 在一段时间内查找最大项目的算法建议

javascript - 如何在 sqlite3 db.get 和 db.all 中使用 async/await?

objective-c - 数据库连接代码,Xcode 4和Sqlite3中的错误

sql-server-2008 - 在 SQL Server 2008 中允许重复的唯一标识符吗?

ruby-on-rails - 基于 2 列定义唯一的主键

java - 查找从一个表到另一个表的连接路径

ipad - 核心数据将 sqlite 保存到 Dropbox - 恢复问题 - 直到应用程序重新启动才加载 Sqlite 文件

sql - 通过 SQL 代码识别候选主键