【问题标题】:How do I create an expression-based index using the instr() function?如何使用 instr() 函数创建基于表达式的索引?
【发布时间】:2019-03-01 22:00:32
【问题描述】:

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

选择 * 来自数据
其中 instr(filepath,'.txt') != 0

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

我尝试创建如下索引:

创建索引 data_instr_filepath 关于数据(instr(文件路径,'.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】:

    原因是索引可能不会用于不等式:-

    同样,索引列通常不会被使用(用于索引 目的)如果它们位于受约束的列的右侧 只有不平等。 The SQLite Query Optimizer Overview

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

    例如

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

    结果:-

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

    【讨论】:

    • 感谢您的回答。我将查询重构为不使用基于不等式的表达式,并且能够创建确实被使用的索引。
    猜你喜欢
    • 2014-12-07
    • 2015-06-28
    • 1970-01-01
    • 2019-08-27
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多