這裏的sqlfiddle of my example,但讓我解釋一下:爲什麼SQLite在WHERE子句中使用文字列值時不使用索引?
當我有一個簡單的表是這樣的:
CREATE TABLE ForgeRock
(`id` int, `productName` varchar(7), `description` varchar(55))
;
而且在productName
列這樣一個簡單的指標:
CREATE INDEX test_idx ON ForgeRock(productName);
我可以使用WHERE子句中的productName
輕鬆選擇數據,並且正在使用我的索引。尼斯。
當我一個硬編碼值添加到我選擇,它也運作良好,並使用該索引中的列清單,太:
SELECT
0 as foo,
0 as bar,
productName,
description
FROM
ForgeRock
WHERE (foo = 0 AND productName IN ('OpenIDM', 'OpenDJ'))
即使使用硬編碼foo
列WHERE子句仍然使用索引(因爲它應該)。但是,這裏是我的問題:爲什麼在我將OR (foo = 1 AND bar IN (1))
添加到WHERE子句時不使用索引?
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));
任何幫助,將不勝感激。再次,here's the sqlfiddle。