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

时间:2019-03-01 22:00:33

标签: sqlite

使用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,'.')));

1 个答案:

答案 0 :(得分:1)

原因是索引可能不会按照:-

用于不等式
  

类似地,通常不会使用索引列(用于索引   目的)(如果它们在受约束的列的右侧)   仅靠不平等。 The SQLite Query Optimizer Overview

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

例如

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

结果:-

  

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