在SQLite中我是否还需要另一个索引?

时间:2013-10-29 05:46:40

标签: sqlite indexing

我在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,作者,标题)

感谢您的指导。

1 个答案:

答案 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子句中的比较以匹配它。)

如果要优化作者首先排序的查询,则需要一个索引作为第一列。

如果您可以使用不同的排序顺序进行不同的查询,则需要多个索引。 在这种情况下,最好只有一列索引,这样索引的数量就不会失控。