背景
imgsmlr是PostgreSQL的一款支持以图搜图的插件,
https://github.com/postgrespro/imgsmlr
这个插件新增了:
1、几种图像特征值数据类型,
2、图像特征值相似算子,
3、图像特征值相似排序索引支持,
4、图像相似排序的索引(通过扩展GiST索引接口实现)支持,
5、png,gif等图像格式特征值提取函数。
图像特征值为64*64的16个区域经过小波转换后的16个浮点数。
在数据量(图片数)非常庞大时,输入一个图片特征值,搜索相似度排行前N的图片,性能如何呢?如何优化呢?
接下来的3篇文档将分别介绍如下三种场景的图像特征值搜索性能以及优化思路:
1、单机单表
2、单机分区表(使用DBLINK 异步调用)
3、citus,多机,sharding 表
附加 - rum 相似查询性能(以及存在的问题)
《PostgreSQL 相似搜索插件介绍大汇总 (rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》
相似查询分元素重叠类,向量类。RUM为第一种元素重叠度类的相似搜索技术。
相似排序,走索引,性能如何,有什么需要优化的点?
git clone https://github.com/postgrespro/rum cd rum . /var/lib/pgsql/.bash_profile USE_PGXS=1 make USE_PGXS=1 make install create extension rum;
1、生成随机浮点数组的UDF接口
create or replace function gen_rand_float4(int,int) returns float4[] as $$ select array(select (random()*$1)::float4 from generate_series(1,$2)); $$ language sql strict;
2、建表,索引
create unlogged table t_rum(id int primary key, arr float4[]); create index idx_t_rum_1 on t_rum using rum(arr);
4、写入随机浮点数数组
vi test.sql \set id random(1,2000000000) insert into t_rum values (:id, gen_rand_float4(10,16)) on conflict(id) do nothing;
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 64 -j 64 -t 10000000
postgres=# select * from t_rum limit