我应该索引主键的列部分

时间:2018-01-22 09:03:41

标签: indexing sqlite

我很清楚使用主键自动创建索引。 然而,多列主键呢?

假设我有这张桌子:

CREATE TABLE mytable(
    created_at TEXT NOT NULL, 
    uuid TEXT NOT NULL, 
    val INTEGER NOT NULL, 
    PRIMARY KEY(created_at, uuid));

像这样查询

SELECT * FROM mytable WHERE created_at > '2018-01-01' AND uuid = 'abc'

将使用主键索引。

但是如果我只搜索uuid呢?

SELECT * FROM mytable WHERE uuid = 'abc'

我应该单独在uuid列上重新创建索引,还是主索引才能正常工作?

1 个答案:

答案 0 :(得分:1)

sqlite> SELECT * FROM mytable WHERE created_at > '2018-01-01' AND uuid = 'abc';
--EQP-- 0,0,0,SEARCH TABLE mytable USING INDEX sqlite_autoindex_mytable_1 (created_at>?)
sqlite> SELECT * FROM mytable WHERE uuid = 'abc';
--EQP-- 0,0,0,SCAN TABLE mytable

但是,在某些情况下,PK索引might be used

  

如果SQLite知道前一个或多个列包含许多重复值,则SQLite可能会对索引使用跳过扫描。 [...]
  SQLite可以知道索引的最左列有多个重复的唯一方法是在数据库上运行ANALYZE命令。

根据您运行的查询,最好将uuid作为主键约束的第一列。