我在索引SQLite数据库时遇到一些麻烦。
背景:我有可在每一列上查询的数据库,所有数据库均为TEXT COLLATE NOCASE,所有条件均为“ LIKE ***%”,数据库在任何情况下均不区分大小写,页面大小为32768我的数据库是只读的,我一次用导入的csv脚本填充了它们。之后,无需修改。我在所有创建(数据库,表,导入,索引)创建之后执行:ANALYZE和PRAGMA优化
我尝试在每列上创建一个索引(我不在乎数据库的大小)。
例如,带有column_a_index
SELECT count(*) FROM my_table WHERE column_a LIKE "A%";
很快。
但是,使用column_a_index,column_b_index,column_c_index
SELECT count(*) FROM my_table WHERE column_a LIKE "A%" AND column_b LIKE "B%" AND column_c LIKE "C%";
慢于
SELECT count(*) FROM my_table NOT INDEXED WHERE column_a LIKE "A%" AND column_b LIKE "B%" AND column_c LIKE "C%";
如果我创建column_a_b_c_index,则请求很快。
几句话:如果索引与条件完全匹配,则请求很快。如果索引与条件不完全匹配,则请求要比没有索引的请求慢!
此答案侧重于您的第二个查询:
SELECT COUNT(*)
FROM my_table
WHERE column_a LIKE 'A%' AND column_b LIKE 'B%' AND column_c LIKE 'C%';
适合该查询的索引将覆盖WHERE
子句中的所有三列:
CREATE INDEX idx ON my_table (column_a, column_b, column_c);
SQLite可能不会使用A,B和C列上的三个单独的索引。实际上,我上面建议的索引也可能不会使用,但这将是此查询的最佳选择。