sqlite:其中包含多个条件和索引

64jmpszr  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(428)

我在索引sqlite数据库时遇到了一些问题。
背景:我有数据库,可以查询每一列,都是文本整理nocase,所有条件是“像***%”,数据库是不区分大小写像,页面大小是32768我的数据库是只读的,我填写了一次导入csv脚本。之后,没有修改。我在所有创建(数据库、表、导入、索引)之后执行:analyze和pragma optimize
我尝试在每一列上创建一个索引(我不关心数据库的大小)。
例如,使用列\索引

SELECT count(*) FROM my_table WHERE column_a LIKE "A%";

很快。
但是,有了列a\u索引,列b\u索引,列c\u索引

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%";

如果我创建一个列\u a\u b\u c\u索引,请求速度很快。
简而言之:如果索引与条件完全匹配,则请求速度很快。如果索引与条件不完全匹配,则请求比没有任何索引的请求慢!
我必须为所有可能的组合创建索引吗?
我使用“select max(rowid)from my\ u table;”而不是“select count(*)from my \u table;”当没有条件时,因为在初始导入之后没有修改我的表。对于只读数据库,你还有其他的建议吗?
我使用“pragma journal\u mode=off;”pragma synchronous=关和“pragma locking\u mode=exclusive;”
有什么想法吗?

icnyk63a

icnyk63a1#

这个答案集中在你的第二个问题上:

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

相关问题