【问题标题】:Fast search on a blob starting bytes in SQLite在 SQLite 中快速搜索 blob 起始字节
【发布时间】:2014-07-23 13:22:48
【问题描述】:

有没有办法为 blob 字段编制索引并将索引用于 blob 搜索的开始?

目前我在文本字段中存储为十六进制的哈希值。 这些十六进制形式的哈希有 32 个字符长,构成了数据库中的大部分数据。

问题是,它们经常被它们的起始字节搜索,如

select * from mytable where hash like '00a1b2%'

我想将它们存储为 blob,因为这样可以节省大约 30% 的数据库大小。不过虽然

select * from mytable where hex(hash) like '00a1b2%'

工作,它也慢得多,似乎不使用索引。

搜索精确的 blob 匹配项确实使用索引,因此索引有效。

有没有办法在使用索引的 blob 开始(使用二进制/memcmp“排序规则”)上执行搜索?

我也尝试过 substr(),它显然比 hex() 快但仍然没有被索引

select * from mytable where substr(hash, 1, 6) = x'00a1b2'

【问题讨论】:

    标签: sqlite blob


    【解决方案1】:

    为了能够对 LIKE 使用索引,表列必须有 TEXT affinity,并且索引必须不区分大小写:

    CREATE TABLE mytable(... hash TEXT, ...);
    CREATE INDEX hash_index ON mytable(hash COLLATE NOCASE);
    

    hexsubstr 等函数可防止使用索引。


    Blob 可以像其他类型一样被索引和比较。 这允许您使用两个比较来表达前缀搜索:

    SELECT * FROM mytable WHERE hash >= x'00a1b2' AND hash < x'00a1b3'
    

    【讨论】:

    • 范围比较 >= &
    • LIKE 始终适用于字符串,该字符串不得包含零字节。
    猜你喜欢
    • 2014-03-21
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多