Sql 我应该使用多列索引还是两个1列索引?

Sql 我应该使用多列索引还是两个1列索引?,sql,sqlite,Sql,Sqlite,我有一个表,我目前定义如下: CREATE TABLE pairs ( id INTEGER PRIMARY KEY, p1 INTEGER, p2 INTEGER, r INTEGER, UNIQUE(p1, p2) ON CONFLICT IGNORE, FOREIGN KEY (p1) REFERENCES points(id), FOREIGN KEY (p2) REFERENCES points(id) ) 之后,它将充满千兆字节的数据。现在我需要做很多选择,就像这样: SEL

我有一个表,我目前定义如下:

CREATE TABLE pairs (  
id INTEGER PRIMARY KEY,
p1 INTEGER,
p2 INTEGER,
r  INTEGER,
UNIQUE(p1, p2) ON CONFLICT IGNORE,
FOREIGN KEY (p1) REFERENCES points(id),
FOREIGN KEY (p2) REFERENCES points(id)
)
之后,它将充满千兆字节的数据。现在我需要做很多选择,就像这样:

SELECT id, r FROM pairs WHERE p1 = 666 OR p2 = 666
所以问题是:我应该创建什么索引来加速这个选择

CREATE INDEX p1_index ON pairs(p1)
CREATE INDEX p2_index ON pairs(p2)
或者可能是

CREATE UNIQUE INDEX p_index ON pairs(p1, p2)
或者两者都有可能?(并为他们购买新的硬盘)。
SQLite3不会自动为多列上的
唯一
约束创建索引

因为您使用的是OR条件,所以我将使用多个索引。如果它是一个AND条件,那么多列索引将更好地工作

在以下情况下: 优化器将开始查看其中一个索引,找到一个匹配项并抓取该行。只有当与第一个索引不匹配时,才会查看另一个索引在多处理器系统上,两个索引也将(应该)并行扫描。太棒了,对吗

在以下情况下: 如果有两个索引可用,优化器必须同时查看这两个索引,合并两个索引扫描的输出,然后从基表中获取结果。这可能是昂贵的。在这里,多列索引会很好

但是,优化器可能会根据可用的表和索引统计信息选择不同的路径

希望这有帮助。

用于检查是否使用了索引

对于示例查询,将使用两个单列索引:

> EXPLAIN QUERY PLAN SELECT id, r FROM pairs WHERE p1 = 666 OR p2 = 666;
0|0|0|SEARCH TABLE pairs USING INDEX p1_index (p1=?) (~10 rows)
0|0|0|SEARCH TABLE pairs USING INDEX p2_index (p2=?) (~10 rows)
如果单个记录的查找同时需要两列,则将使用多列索引(由于唯一约束,您已经拥有了多列索引):

> EXPLAIN QUERY PLAN SELECT id, r FROM pairs WHERE p1 = 666 AND p2 = 666;
0|0|0|SEARCH TABLE pairs USING INDEX sqlite_autoindex_pairs_1 (p1=? AND p2=?) (~1 rows)
但是,多列索引也可用于查找其第一列:

另请参阅文档:


.

当我使用.index查看我的索引时,它显示主键列的自动索引,但没有唯一约束的索引。我认为只有在列描述中定义了UNIQUE时,它才会创建索引,而不是作为单独的语句。
.index
不显示内部索引(如我的示例中的
sqlite\u autoindex\u pairs\u 1
)。
> DROP INDEX p1_index;
> EXPLAIN QUERY PLAN SELECT id, r FROM pairs WHERE p1 = 666 OR p2 = 666;
0|0|0|SEARCH TABLE pairs USING INDEX sqlite_autoindex_pairs_1 (p1=?) (~10 rows)
0|0|0|SEARCH TABLE pairs USING INDEX p2_index (p2=?) (~10 rows)