使用前缀查询 bytea 列

Fla*_*ien 3 postgresql performance index postgresql-performance

假设我有一个表,其中有一个名为 的表上的bytea列,我该如何:datat

  1. 编写一个查询,返回列上具有特定前缀的所有行data
  2. 为查询建立索引。

我正在使用 Postgresql 9.5。

jja*_*nes 5

对于按前缀搜索,您只需这样做即可。困难的部分(至少从命令行)是以正确转义的方式获取要查询的二进制数据。

要在文件 blob 表中查询具有 ELF 标头的文件:

select....where data like (E'\\x7f')::bytea||'ELF%'
Run Code Online (Sandbox Code Playgroud)

对于索引它,您将遇到的主要问题是 PostgreSQL btree 索引无法索引长于页面大小 1/3(通常为 2712 字节)的值,并且一列二进制数据可能有一些超过该值的记录。您可以仅在数据的前几个字节上构建功能索引,然后对其进行查询。

create index on thing (substring(data,1,100));
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样查询它:

 select....where substring(data,1,100) like (E'\\x7f')::bytea||'ELF%';
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 不够聪明,没有意识到对于匹配完整列的前缀,它大多数情况下也会匹配比列的查询前缀更长的前缀。因此,这意味着您必须针对用于构建索引的表达式编写匹配项,而不是针对列本身,否则将不会使用索引。