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

SQLite中blob起始字节的快速搜索,sqlite,blob,Sqlite,Blob,是否有方法为blob字段编制索引,并将索引用于blob搜索的开始 目前,我在文本字段中将哈希存储为十六进制。 这些十六进制格式的散列长度为32个字符,构成数据库中的大部分数据 问题是,它们通常按起始字节进行搜索,如中所示 select * from mytable where hash like '00a1b2%' 我希望将它们存储为blob,因为这样可以节省大约30%的数据库大小。然而当 select * from mytable where hex(hash) like '00a1b2%'

是否有方法为blob字段编制索引,并将索引用于blob搜索的开始

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

问题是,它们通常按起始字节进行搜索,如中所示

select * from mytable where hash like '00a1b2%'
我希望将它们存储为blob,因为这样可以节省大约30%的数据库大小。然而当

select * from mytable where hex(hash) like '00a1b2%'
工作,它也慢得多,似乎没有使用索引

搜索完全匹配的blob确实会使用索引,因此索引可以正常工作

有没有一种方法可以在使用索引的blob开始(使用binary/memcmp“collation”)上执行搜索

我还尝试了substr(),它显然比hex()快,但仍然没有索引

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

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

CREATE TABLE mytable(... hash TEXT, ...);
CREATE INDEX hash_index ON mytable(hash COLLATE NOCASE);
hex
substr
这样的函数可以防止使用索引


blob可以像其他类型一样进行索引和比较。 这允许您通过两个比较来表示前缀搜索:

SELECT * FROM mytable WHERE hash >= x'00a1b2' AND hash < x'00a1b3'
从mytable中选择*,其中哈希>=x'00a1b2'和哈希
与>=&<的范围比较非常有效,谢谢!我尝试将BLOB存储在具有文本关联性的列中,但是当BLOB以零开头时失败(稍后BLOB中的零似乎没问题)。LIKE始终适用于字符串,其中不得包含零字节。