我在SQLLite中的三列中设置了一个唯一索引,我想知道是否需要任何其他索引,因为从以下查询中检索结果有时需要大约10秒(数据库大小只有大约25,000行):
SELECT * FROM books
WHERE (Author="Roger Davies" COLLATE NOCASE AND
Title>="My Best Days" COLLATE NOCASE AND
CatID>"rtYY91" COLLATE NOCASE )
OR Author > "Roger Davies" COLLATE NOCASE
ORDER BY Author COLLATE NOCASE ASC,
Title COLLATE NOCASE ASC,
CatID COLLATE NOCASE ASC LIMIT 10
索引是: CREATE UNIQUE INDEX booksIndex ON books(CatID,作者,标题)
感谢您的指导。
答案 0 :(得分:2)
根本没有使用索引。 (你可以用EXPLAIN QUERY PLAN注意到这一点。)
为了能够使用此查询的索引,请将COLLATE NOCASE添加到index definition中的列。
但是,索引中的列只能从最左边的索引列开始使用,并且不等式比较(如> =)只能在 one 列中使用(如果是索引),并且防止使用任何其他索引列。
因此,可以通过此特定索引优化的可能比较是:
CatID = x
;或CatID > x
;或CatID = x AND Author = y
;或CatID = x AND Author > y
;或CatID = x AND Author = y AND Title = z
;或CatID = x AND Author = y AND Title > z
。(但是,优化器能够重新排序WHERE子句中的比较以匹配它。)
如果要优化作者首先排序的查询,则需要一个索引作为第一列。
如果您可以使用不同的排序顺序进行不同的查询,则需要多个索引。 在这种情况下,最好只有一列索引,这样索引的数量就不会失控。