【问题标题】:SQLite index usage with different type affinity具有不同类型亲和力的 SQLite 索引使用情况
【发布时间】:2016-06-07 21:56:16
【问题描述】:

我有一个简单的表“标签”,其中包含一个键和一个值列。键始终是字符串,值可以是字符串、int64 或双精度值。

我目前没有任何真实数据可供测试。但是我很好奇 value 列的索引使用情况。我已将该列定义为 TEXT 类型 - 当 int64 或 double 类型绑定到语句时,SQLite 是否仍然能够使用 value 列上的索引?

这是测试表:

CREATE TABLE "tags" ("key" TEXT,"value" TEXT DEFAULT (null) );
INSERT INTO "tags" VALUES('test','test');
INSERT INTO "tags" VALUES('testint','1');
INSERT INTO "tags" VALUES('testdouble','2.0');

通过以下方式分析查询时,我看到了额外的“整数”和“关联”条目:

explain SELECT value FROM tags where key = "testint" and value >= 1

但我没有看到索引使用有任何差异(例如,总是使用 idxgt)。但我宁愿有一个明确的答案,而不是依靠小测试数据的错误假设。

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    documentation 说:

    具有 TEXT 亲和性的列使用存储类 NULL、TEXT 或 BLOB 存储所有数据。如果将数值数据插入到具有 TEXT 亲和性的列中,则在存储之前将其转换为文本形式。

    所有类型的排序顺序为well-defined。 将亲和力强制为 TEXT 会使该列与数字的比较表现得好像值是文本一样,但这可能是您想要的。

    在任何情况下,索引都不会改变行为;它们适用于所有类型,并以与非索引列完全相同的方式应用关联。

    【讨论】:

    • 我可能还不够清楚:除了我存储数值,并且您正确声明在存储时转换为文本之外,我实际上需要查询数字 和 i> 文本值。文本索引将以这种方式对以下字符串进行排序:“1”、“20”、“3”。数字索引会将其排序为 1、3 20。尽管问题仍然存在,但当说“使用存储在文本列中的整数查询整数值”时,SQLite 是否仍会部分使用索引。显而易见的解决方法是为每种类型使用三个字段 - 但如果可以的话,我宁愿避免使用它。
    • 这是我提出的问题的正确答案,尽管在我的情况下有一个问题(我没有在我的问题中提到需要对结果进行排序):需要转换值到整数以获得数字顺序 - 当结果集中有许多大数字时,这可能会很昂贵。而这也需要使用外部排序和存储。例如,由于需要在结果之间进行外部排序和查找,以下内容更昂贵:解释 SELECT value FROM tags where key = "test" and value >= 1 order by cast(value as integer)
    • 这个特定查询的最快索引是覆盖expression index: create index tkviv on tags(key, cast(value as integer), value);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2010-11-21
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多