我有以下索引:
CREATE INDEX IF NOT EXISTS dateIdx ON table1 (DateFirstAdded COLLATE NOCASE)
查询的以下ORDER BY部分成功使用索引:
ORDER BY DateFirstAdded COLLATE NOCASE ASC LIMIT 100
但以下情况并非如此:
ORDER BY DateFirstAdded is null COLLATE NOCASE, DateFirstAdded COLLATE NOCASE ASC LIMIT 100
是否可以使其工作,如果是,是否需要进行新的索引或查询调整?
由于
答案 0 :(得分:1)
在从表中读取记录后,不能使用索引加快的排序;使用它的唯一方法是逐步浏览索引条目,而查询正在从表中读取数据。
这意味着索引中条目的顺序必须与ORDER BY子句中指定的顺序完全相同。
在这种情况下,没有索引将DateFirstAdded IS NULL
作为其第一列(并且SQLite不支持表达式索引);您的索引最后有NULL记录。
(请注意,IS NULL返回0或1,不需要排序规则。)
要最后返回NULL记录并仍然使用索引进行排序,您必须将查询拆分为复合查询,该查询分别返回非NULL和NULL记录;为了能够使用ORDER BY,你必须使用子查询:
SELECT *
FROM (SELECT *
FROM table1
WHERE DateFirstAdded IS NOT NULL -- uses index
ORDER BY DateFirstAdded COLLATE NOCASE) -- implied by index scan
UNION ALL
SELECT *
FROM table1
WHERE DateFirstAdded IS NULL -- uses index
LIMIT 100