Есть простенькая табличка:
CREATE TABLE "cashes" (
"id" INTEGER PRIMARY KEY NOT NULL,
"date" DATE NOT NULL,
"uid" INT(10) NOT NULL DEFAULT ('1'),
"visible" TINYINT(4) NOT NULL DEFAULT ('1')
)
И пара индексов по ней:
CREATE INDEX "XIF_CASHES_USR" on cashes (uid ASC);
CREATE INDEX "XIF_CASHES_DUV" on cashes (date DESC, uid ASC, visible ASC);
Строгий запрос по определенной дате использует нужный индекс по 3 полям:
EXPLAIN QUERY PLAN SELECT
c.id, c.uid, c.date
FROM cashes c
WHERE
c.date = '2013-04-01'
AND c.uid = 1 AND c.visible = 1
ORDER BY
c.date
План:
SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_DUV (date=?) (~2 rows)
А вот запрос с benween уже нет:
EXPLAIN QUERY PLAN SELECT
c.id, c.uid, c.date
FROM cashes c
WHERE
c.date BETWEEN '2013-04-01' AND '2013-06-01'
AND c.uid = 1 AND c.visible = 1
ORDER BY
c.date
Судя по плану уже подхватывается не тот индекс:
SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_USR (uid=?) (~2 rows)
Собственно, как заставить SQLite 3 использовать индекс по дате в запросах с BETWEEN?