我在索引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;”
有什么想法吗?
1条答案
按热度按时间icnyk63a1#
这个答案集中在你的第二个问题上:
适合此查询的索引将覆盖
WHERE
条款:sqlite可能不会使用a、b和c列上的三个单独索引。实际上,我上面建议的索引可能也不会被使用,但它是这个查询的最佳选择。