ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

32 · 大规模数据导入与索引构建

32 · 大规模数据导入与索引构建 32 · 大规模数据导入与索引构建一句话海量向量入库的黄金法则是先导数据、后建索引配合 COPY、并行、加大维护内存能快几十倍。1. 核心法则先导数据后建索引如果表上已有 HNSW 索引再逐条插入每插一条都要维护索引图非常慢。正确顺序1) 建空表不建向量索引 2) 批量导入所有数据 3) 最后一次性建向量索引-- 1) 建表先不建向量索引CREATETABLEitems(id bigserialPRIMARYKEY,embedding vector(1536));-- 2) 批量导入数据见下文-- 3) 数据到位后再建索引SETmax_parallel_maintenance_workers7;SETmaintenance_work_mem8GB;CREATEINDEXONitemsUSINGhnsw(embedding vector_cosine_ops);2. 用 COPY 高速导入比 INSERT 快很多COPY是 PG 最快的批量导入方式远胜逐条INSERT。准备一个 CSV向量列写成[0.1,0.2,...]content,embedding 笔记本,[0.1,0.2,0.3] 手机,[0.4,0.5,0.6]导入COPY items(content,embedding)FROM/path/to/data.csvWITH(FORMAT csv,HEADERtrue);从客户端导入用\copypsql 内\copy items (content, embedding) FROM data.csv WITH (FORMAT csv, HEADER true)3. 程序批量写入的技巧如果必须用代码写如 Java批量提交一次INSERT多行几百~几千行或用 JDBCaddBatch/executeBatch。关自动提交一个事务提交一大批减少事务开销。临时去索引导入前DROP INDEX导完再建。conn.setAutoCommit(false);// addBatch 多条后 executeBatch再 commit4. 加速建索引的三板斧-- 1) 加大维护内存让索引尽量在内存里构建SETmaintenance_work_mem8GB;-- 2) 开并行用多个 worker 一起建SETmax_parallel_maintenance_workers7;-- 一般设 CPU 核数-1-- 3) 建索引CREATEINDEXONitemsUSINGhnsw(embedding vector_cosine_ops);HNSW 建索引很吃内存和 CPU这三项能显著缩短时间。5. 观察建索引进度pgvector 建 HNSW 时可查进度SELECTphase,round(100.0*blocks_done/NULLIF(blocks_total,0),1)ASpctFROMpg_stat_progress_create_index;能看到当前阶段和百分比避免以为卡死了。6. 不阻塞线上CONCURRENTLY普通CREATE INDEX会锁表写入。线上表要用CONCURRENTLY不阻塞读写CREATEINDEXCONCURRENTLYONitemsUSINGhnsw(embedding vector_cosine_ops);代价建得更慢、占用更多资源但不影响业务。7. 分批导入超大数据上亿数据一次导容易爆内存/超时建议分批按 doc_id / 时间 / id 区间分成多批 每批COPY 导入 → 提交 全部导完 → 统一建索引配合第 34 章的 pgvectorscale 或分区表能支撑更大规模。8. 导入后别忘了 ANALYZE导入大量数据后更新统计信息让优化器决策更准ANALYZEitems;9. 完整流程模板-- 1) 建表无向量索引CREATETABLEitems(id bigserialPRIMARYKEY,contenttext,embedding vector(1536));-- 2) 高速导入\copy items(content,embedding)FROMdata.csvWITH(FORMAT csv,HEADERtrue)-- 3) 调优参数SETmaintenance_work_mem8GB;SETmax_parallel_maintenance_workers7;-- 4) 建索引线上用 CONCURRENTLYCREATEINDEXONitemsUSINGhnsw(embedding vector_cosine_ops);-- 5) 更新统计ANALYZEitems;10. 一句话总结大规模导入记住先导后建用 COPY 高速灌数据再加大maintenance_work_mem 并行一次性建索引线上用CONCURRENTLY导完ANALYZE。➡️ 下一章33-增量更新删除与索引维护.md长期运行后的更新、删除与索引维护。
返回列表