事情本身不复杂,线索都在日志里。SaaS 场景所有租户共用 faq 集合,租户字段只存在 payload 里没建索引,带租户过滤的查询 P99 从 120 毫秒涨到 900 毫秒,大租户还在扫全表。
第一反应是「租户数据量差异大,扫描成本不均」,验证下来不成立。
原因不止一个,得分开看。过滤字段没有建立 payload 索引。少数情况下是每次查询都带租户条件,等于全量扫描。
还有一种情况,没有按租户统计查询耗时,问题被平均掉。
先看带租户过滤的查询耗时分布
python -c "import json;d=json.load(open('q.json'));print(sorted(d)[-5:])"
给租户字段建 keyword 索引
python index_field.py --collection faq --field tenant_id --type keyword
随后重跑同一批查询对比 P99
python bench_search.py --queries q_500.jsonl --filter tenant
末了按租户拆开看是否有异常大租户
python bench_search.py --queries q_500.jsonl --by tenant --top 10
改完先别撤,确认这几项。带租户过滤的 P99 回到 140 毫秒,大租户与小租户的耗时差距缩小到 2 倍以内,扫描行数下降一个量级。
向量库的过滤不是免费的,字段没索引时就是逐条判断;多租户共用一个集合没问题,但租户字段必须进索引。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
