Hier ist der sqlfiddle of my example, aber lassen Sie mich erklären:Warum verwendet SQLite keinen Index, wenn ein literaler Spaltenwert in der WHERE-Klausel verwendet wird?
Wenn ich eine einfache Tabelle wie folgt aus:
CREATE TABLE ForgeRock
(`id` int, `productName` varchar(7), `description` varchar(55))
;
Und einen einfachen Index auf der productName
Spalte wie folgt aus:
CREATE INDEX test_idx ON ForgeRock(productName);
I kann einfach Daten unter Verwendung der productName
in der WHERE-Klausel auswählen und mein Index wird verwendet. Nett.
Wenn ich einen hartcodierte Wert in der Liste der Spalten hinzufügen Ich Auswahl, auch es funktioniert gut und der Index verwendet wird, auch:
SELECT
0 as foo,
0 as bar,
productName,
description
FROM
ForgeRock
WHERE (foo = 0 AND productName IN ('OpenIDM', 'OpenDJ'))
Selbst die hartcodierte foo
Spalt in Die WHERE-Klausel verwendet immer noch den Index (wie es sollte). Aber hier ist meine Frage: Warum wird der Index NICHT verwendet, wenn ich OR (foo = 1 AND bar IN (1))
der WHERE-Klausel hinzufüge?
SELECT
0 as foo,
0 as bar,
productName,
description
FROM
ForgeRock
WHERE (foo = 0 AND productName IN ('OpenIDM', 'OpenDJ')) OR (foo = 1 AND bar IN (1));
Jede Hilfe wäre willkommen. Noch einmal, here's the sqlfiddle.