快速搜索SQLite中的blob起始字节

Eri*_*nge 7 sqlite blob

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

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

问题是,它们通常按起始字节搜索,如

select * from mytable where hash like '00a1b2%'
Run Code Online (Sandbox Code Playgroud)

我想将它们存储为blob,因为这可以节省大约30%的数据库大小.然而

select * from mytable where hex(hash) like '00a1b2%'
Run Code Online (Sandbox Code Playgroud)

工作,它也慢得多,似乎没有使用索引.

搜索精确的blob匹配确实使用索引,因此索引正在运行.

有没有办法在使用索引的blob start(使用binary/memcmp"collat​​ion")上执行搜索?

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

select * from mytable where substr(hash, 1, 6) = x'00a1b2'
Run Code Online (Sandbox Code Playgroud)

CL.*_*CL. 7

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

CREATE TABLE mytable(... hash TEXT, ...);
CREATE INDEX hash_index ON mytable(hash COLLATE NOCASE);
Run Code Online (Sandbox Code Playgroud)

功能类似hexsubstr阻止使用索引.


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

SELECT * FROM mytable WHERE hash >= x'00a1b2' AND hash < x'00a1b3'
Run Code Online (Sandbox Code Playgroud)