我很清楚使用主键自动创建索引。 然而,多列主键呢?
假设我有这张桌子:
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列上重新创建索引,还是主索引才能正常工作?
答案 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
作为主键约束的第一列。