1

我在 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, Author, Title )

感谢您的指导。

4

1 回答 1

2

根本不使用索引。(您可以通过EXPLAIN QUERY PLAN注意到这一点。)

要使该查询可以使用索引,请将 COLLATE NOCASE 添加到索引定义中的列。

但是,索引中的列只能从最左边的索引列开始使用,如果是索引,则只能在一个列中使用不等式比较(如 >=),并防止使用任何其他索引列。

因此,可以通过此特定索引优化的可能比较是:

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

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

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

于 2013-10-29T08:09:33.707 回答