❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3400人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7 8群已经爆满 9群 300+,开10群PolarDB专业学习群110+)
在使用pgvector的工作中,一开始我对pgvector并不完全熟悉,我个人认为pgvector是一种新的数据操作模式,会有新的一种操作理念。
2026 年Austindatabases 公众号,内容剧透 (2026年将遵循剧透内容,利他的内容多一些,和大家一起成长)
这是一个系列,AI已经进入一些公司,恰巧我的工作正在经历这个阶段,组织学习和工作的内容,经验,这是一个常系列,希望大家都能跟上发展的部分和节奏,不掉队。
我很笨--学习PGVector的 1个小时我懂得了AI 基本的原理--要不你也试试!!
随着深入学习,看来是我错了,大部分pgvector的数据查询,都融合在SQL的本身中,比如下面这个查询向量的语句中。
SELECT *
FROM items
WHERE category = 'news'
ORDER BY embedding <-> '[...]'
LIMIT 10;
在查询中,order by embedding <-> 本身是一个排序的查询,和我们在处理数据中的order by create_time 没有任何区别只是排序从标量变成高维向量的距离模式。
而排序在执行器内部会被当成,一个distance function 也就是一个距离的函数,并且是一个可排序的表达式,一个可被索引加速的操作符。
所以向量查询并非我们想象的复杂,仅仅是向量距离 类似 数值函数,向量索引类似特殊索引访问路径。
以上面的这个语句作为出发点,适合hybrid search ,结构过滤+非结构化相似度和二为一的查询,条件中执行的阶段为多算子协同,数据库原生支持混合查询模式。
下面我们演示一下
^
test=# select * from pg_extension ;
oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+---------+----------+--------------+----------------+------------+-----------+--------------
14482 | plpgsql | 10 | 11 | f | 1.0 | |
16715 | vector | 10 | 2200 | t | 0.8.1 | |
(2 rows)
test=# CREATE TABLE items (
id BIGSERIAL PRIMARY KEY,
category TEXT,
user_id INT,
created_at TIMESTAMP,
embedding vector(3)
);
INSERT INTO items (category, user_id, created_at, embedding) VALUES
('news', 1, now() - interval '1 day', '[0.1, 0.2, 0.3]'),
('news', 2, now() - interval '2 day', '[0.2, 0.1, 0.4]'),
('news', 1, now() - interval '3 day', '[0.9, 0.8, 0.7]'),
('sports', 1, now() - interval '1 day', '[0.1, 0.2, 0.25]'),
('sports', 2, now() - interval '2 day', '[0.8, 0.7, 0.6]');
我们看看这二者的查询计划的不同之处
test=# explain (verbose) SELECT
test-# id,
test-# category,
test-# embedding,
test-# embedding <-> '[0.1,0.2,0.3]' AS distance
test-# FROM items
test-# ORDER BY embedding <-> '[0.1,0.2,0.3]'
test-# LIMIT 5;
QUERY PLAN
----------------------------------------------------------------------------------------
Limit (cost=30.96..30.97 rows=5 width=80)
Output: id, category, embedding, ((embedding <-> '[0.1,0.2,0.3]'::vector))
-> Sort (cost=30.96..32.76 rows=720 width=80)
Output: id, category, embedding, ((embedding <-> '[0.1,0.2,0.3]'::vector))
Sort Key: ((items.embedding <-> '[0.1,0.2,0.3]'::vector))
-> Seq Scan on public.items (cost=0.00..19.00 rows=720 width=80)
Output: id, category, embedding, (embedding <-> '[0.1,0.2,0.3]'::vector)
(7 rows)
test=#
test=# explain (verbose) SELECT
test-# id,
test-# category,
test-# embedding,
test-# embedding <-> '[0.1,0.2,0.3]' AS distance
test-# FROM items
test-# WHERE category = 'news'
test-# ORDER BY embedding <-> '[0.1,0.2,0.3]'
test-# LIMIT 3;
QUERY PLAN
----------------------------------------------------------------------------------------
Limit (cost=19.05..19.06 rows=3 width=80)
Output: id, category, embedding, ((embedding <-> '[0.1,0.2,0.3]'::vector))
-> Sort (cost=19.05..19.06 rows=4 width=80)
Output: id, category, embedding, ((embedding <-> '[0.1,0.2,0.3]'::vector))
Sort Key: ((items.embedding <-> '[0.1,0.2,0.3]'::vector))
-> Seq Scan on public.items (cost=0.00..19.01 rows=4 width=80)
Output: id, category, embedding, (embedding <-> '[0.1,0.2,0.3]'::vector)
Filter: (items.category = 'news'::text)
(8 rows)
在查询中我们看到 seq scan
CREATE INDEX idx_items_embedding_ivf
ON items
USING ivfflat (embedding vector_l2_ops)
WITH (lists = 10);
在建立索引时,这里使用的是pgvector 提供的ivfflat 方式,这个索引的结构是
lists (簇中心)
├─ list 1 → 一堆向量
├─ list 2 → 一堆向量
└─ list N → 一堆向量
类似于Bitmap index + heap scan 的思路,USING ivfflat (embedding vector_l2_ops) 这里的意思是我们对embedding这个矢量字段建立索引,后面的vector_l2_ops,的意思是与操作矢量的方式有关。
<-> vector_l2_ops 欧式距离 寻找几何空间中的最近的点
<#> vector_ip_ops(内积) 相似度打分
<=> vector_cosine_ops 方向接近 余弦距离
关于这个部分我们下期在和大家讲。
我们现在的往回收一收,总结一下ivfflat 索引本身的一些特点
1 ivfflat 是一个类似聚类+桶内搜索的扫描的索引结构 ,inverted file with flat vectors.
2 查询的时候会计算出 query 向量到所有的中心距离,然后选出最近的list 列,后面扫描这些list中的向量,计算真实的距离,做top-k的排序。
3 在构建索引会查看空啊进被分成多少个桶,这类会影响索引本身的大小,桶的平均容量,等所以在构建时,会带上 with (lists = N).
在查询的时候,可以设置实际要扫描多少个桶,桶越多,精度越高,延迟越高。
IVFFLAT 的优点是扫描的量是可控的,扫描的算法是简单的,同时对于数据插入是比较快的。所以成本是较低的,而他的问题也很清晰,就是where 不参与分桶,必须回表过滤,在为了查询速度快的情况下,会漏掉一些结果,还有对于大表第一次建立索引时的成本会比较高,需要全量扫描。
下面我们把这些代入
CREATE INDEX idx_items_embedding_ivf
ON items
USING ivfflat (embedding vector_l2_ops)
WITH (lists = 300);
SET ivfflat.probes = 5;
这里我们构建了一个将向量空啊进粗略划分诶300个的lists的方式,
IVF 索引
├─ list 1 → 333 vectors
├─ list 2 → 332 vectors
├─ ...
└─ list 300 → 335 vectors
每个list大约都是300多个,然后查询中找到5个list ,这里 ivfflat.probes =5 ,然后扫描这5个list中的全部向量。所以使用 ivfflat 中 lists = 结构参数(建索引时定) probes = 行为参数(查询时调)向量数越多,list 就应该越多,
今天我们学习了ivfflat索引和一个简单的查询的例子,后面我们会继续学习pgvector的操作和原理
置顶
2026 年Austindatabases 公众号,内容剧透
现在的AI是骗局?AI 是一个大傻子--图灵奖获得者 AI 教父 杨立昆 说
PostgreSQL 从库查询被莫名KILL,为什么,群友问题--大聪明给你回答一下
MongoDB AI 企业数据基础平台--解读 2025 纽约 数据库大会内容
不要用MySQL --2026年国外数据库专家,警告数据库使用者,不要再用MySQL
SQL SERVER 2025 盘子还是人家的-- Oracle 若是西楚霸王,MSSQL 则是“成本女杀手” 貂蝉
Oracle 2025 AI 大会---数据库业界时装秀-- Oracle的三绑定注定未来持续辉煌
PostgreSQL 官方网站写着shared buffer 25% 是正确的吗? 你真信那是最优选?
全网最专业PolarDB-MySQL 大SQL解决方案--之代理设置与强制HINT (三)
全网最专业PolarDB-MySQL 大SQL解决方案--之列式索引节点原理 (二)
全网最专业PolarDB-MySQL 大SQL解决方案--之如何添加列式索引 (一)
PostgreSQL Bitmap scan 和 Index scan 优化一个SQL ,结果非常不一样!
PostgreSQL 平时没事,怎么就一个SQL下去就不行了?,原来是老毛病了!
在测试浪潮 KaiwuDB-lite 后,留下几个大字 "你别挨骂了"
PostgreSQL 现世报,客户吐槽不如SQL SERVER 与 国产数据库搞兼容性
阿里云 PolarDB for MySQL IMCI 绞杀SQL优化专家,My GOD!!
微软布局PostgreSQL 就在昨天发布新品--云厂商爱PG到底是个什么梗!!
2022年 Sqlite白皮书对比DuckDB差异 -- 什么叫做关公战秦琼
阿里云产品选择困难症,RDS 还是 PolarDB 希望能讲明白
SQLite3 为什么会打败PostgreSQL 的原因分析,PostgreSQL 在移动端也是不错的选

本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!