如何使用instr()函数创建基于表达式的索引?

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

使用Sqlite3,我正在尝试执行以下查询:

从数据中选择* instr(filepath,'。txt')!= 0

我想索引此查询以加快速度。

我试图创建一个像这样的索引:

在数据上创建索引data_instr_filepath(instr(filepath,'。txt'));

但是,“解释查询计划”仍然显示我正在进行表扫描。

这在sqlite中可行吗?我发现用于执行基于表达式的索引的示例似乎仅限于长度函数并将两列相乘。

更新:

感谢Mike的回答,我重构了我的查询,不使用不等式,并且能够创建一个能够满足它的索引。以下是我最终使用的索引:

create index data_instr_filepath_txt on data(instr(filepath,'.txt'));

create index data_instr_filepath_substr on data(substr(filepath,0,instr(filepath,'.')));
sqlite
1个回答
1
投票

原因是索引可能不会用于不平等,因为: -

类似地,如果索引列位于仅受不等式约束的列的右侧,则通常不会使用索引列(用于索引)。 The SQLite Query Optimizer Overview

您可以尝试使用INDEXED BY强制使用索引。但是,由于以上标记索引不可用,因此在您的情况下不起作用。 (查询仍然有效)

EG

EXPLAIN QUERY PLAN
SELECT * FROM data INDEXED BY data_instr_filepath
WHERE instr(filepath,'.txt') != 0

结果是 :-

无查询解决方案时间:0s

© www.soinside.com 2019 - 2024. All rights reserved.