SQLite:具有多个条件和索引的地方

问题描述 投票:0回答:1

我在索引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,则请求很快。

几句话:如果索引与条件完全匹配,则请求很快。如果索引与条件不完全匹配,则请求要比没有索引的请求慢!

  • 我必须为所有可能的组合创建索引吗?
  • 我使用“来自my_table的SELECT MAX(ROWID);”而不是“ SELECT COUNT(*)FROM my_table;”没有条件时,因为在初始导入后没有对我的表进行任何修改。您还有其他只读数据库提示吗?
  • 我使用“ PRAGMA journal_mode = OFF;”,“ PRAGMA sync = OFF;”和“ PRAGMAlocking_mode = EXCLUSIVE;”
  • 有什么想法吗?
sql sqlite indexing database-performance sqlperformance
1个回答
0
投票

此答案侧重于您的第二个查询:

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列上的三个单独的索引。实际上,我上面建议的索引也可能不会使用,但这将是此查询的最佳选择。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.