zuochenyong
28a86c3b2c
feat(compare): 比价记录列表增加分页 (#156)
GET /api/v1/compare/records 新增 ordered / keyword 两个查询参数,过滤全部下推到 SQL。
不能分页之后再由客户端 filter —— 一页里可能一条都不命中,列表看着就是空的,
得翻很多页才蹦出一条。
顺带修掉这条链路上几处随数据量线性变慢的地方:
- 列表查询 defer raw_payload / llm_calls / llm_price_snapshot 三个重型 JSON 列。
出参 ComparisonRecordOut 根本不读,却是每页几百 KB~几 MB 的白读 + 白反序列化,
是「比价记录/全部记录」页慢的主要来源;详情接口不 defer,raw_payload 照常返回。
- 「已下单」标记改为只按本页店名(≤ limit 条)反查 savings,不再把该用户全部下单
店名捞进内存跟 50 条记录取交集。
- 新增 (user_id, created_at, id) 复合索引:反向扫恰好等于列表的
ORDER BY created_at DESC, id DESC,PG 免排序直接取前 n 条。
迁移走 CREATE INDEX CONCURRENTLY,不阻塞线上 harvest 写入。
- keyword 转义 LIKE 通配符后再匹配,避免搜一个「%」把整表拉回来。
- nginx 对 application/json 开 gzip:此前 gzip off + gzip_types 只含 text/html
+ gzip_proxied off 三个默认值凑一起,等于所有接口都在裸奔;记录列表这种
字段名和中文店名高度重复的 JSON 压缩比稳定 8~10 倍。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: 左辰勇 <exinglang@gmail.com>
Reviewed-on: #156
Co-authored-by: zuochenyong <zuochenyong@wonderable.ai>
Co-committed-by: zuochenyong <zuochenyong@wonderable.ai>
2026-07-22 17:18:26 +08:00
..
2026-05-23 17:37:18 +08:00
2026-06-08 05:54:55 +08:00
2026-07-22 15:42:25 +08:00
2026-06-23 17:58:30 +08:00
2026-06-27 03:06:53 +08:00
2026-06-02 09:53:25 +08:00
2026-06-10 22:49:33 +08:00
2026-06-08 00:16:25 +08:00
2026-07-09 17:31:24 +08:00
2026-07-18 19:11:45 +08:00
2026-07-01 20:21:34 +08:00
2026-06-26 23:33:31 +08:00
2026-06-06 00:42:39 +08:00
2026-06-16 01:39:05 +08:00
2026-06-10 02:28:56 +08:00
2026-06-01 22:23:15 +08:00
2026-07-11 13:47:12 +08:00
2026-06-09 01:56:47 +08:00
2026-06-23 17:33:38 +08:00
2026-06-29 09:54:13 +08:00
2026-06-15 23:13:14 +08:00
2026-07-22 10:53:21 +08:00
2026-05-27 21:04:03 +08:00
2026-06-21 00:16:40 +08:00
2026-07-05 09:46:19 +08:00
2026-06-04 03:02:41 +08:00
2026-07-09 01:09:03 +08:00
2026-07-05 09:46:19 +08:00
2026-07-21 13:52:40 +08:00
2026-06-06 04:13:08 +08:00
2026-06-17 10:00:29 +08:00
2026-06-06 00:42:39 +08:00
2026-06-24 20:50:21 +08:00
2026-06-26 23:56:29 +08:00
2026-05-27 21:04:03 +08:00
2026-06-21 00:16:40 +08:00
2026-06-07 23:17:27 +08:00
2026-06-09 01:56:47 +08:00
2026-06-13 03:53:43 +08:00
2026-06-17 22:33:33 +08:00
2026-07-13 17:46:11 +08:00
2026-06-01 22:23:15 +08:00
2026-07-05 09:46:19 +08:00
2026-06-01 22:23:15 +08:00
2026-06-01 22:23:15 +08:00
2026-07-04 02:39:12 +08:00
2026-06-10 22:26:51 +08:00
2026-06-23 17:24:54 +08:00
2026-07-22 17:18:26 +08:00
2026-07-09 17:31:48 +08:00
2026-06-10 16:07:33 +08:00
2026-06-14 23:41:54 +08:00
2026-06-30 22:59:36 +08:00
2026-07-09 17:31:48 +08:00
2026-06-30 22:59:36 +08:00
2026-06-30 22:59:36 +08:00
2026-06-08 03:20:51 +08:00
2026-06-17 21:32:10 +08:00
2026-06-17 10:00:29 +08:00
2026-06-17 10:00:29 +08:00
2026-06-25 17:47:30 +08:00
2026-06-19 11:44:11 +08:00
2026-06-10 22:26:51 +08:00
2026-06-15 23:13:14 +08:00
2026-06-26 15:28:16 +08:00
2026-06-23 17:33:38 +08:00
2026-06-23 17:33:38 +08:00
2026-07-22 15:42:25 +08:00
2026-07-22 10:53:21 +08:00
2026-06-12 00:51:47 +08:00
2026-06-06 04:13:08 +08:00
2026-05-29 15:20:22 +08:00
2026-06-10 15:43:54 +08:00
2026-05-30 18:13:11 +08:00
2026-06-22 23:18:42 +08:00
2026-06-29 23:11:30 +08:00
2026-05-28 22:27:36 +08:00
2026-07-02 19:50:14 +08:00
2026-05-27 21:04:03 +08:00
2026-06-27 02:58:29 +08:00
2026-06-08 04:57:55 +08:00
2026-06-09 21:48:48 +08:00
2026-06-30 21:56:58 +08:00
2026-06-20 13:39:45 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-23 21:09:10 +08:00
2026-06-08 00:16:25 +08:00
2026-07-18 19:11:45 +08:00
2026-06-09 18:10:58 +08:00
2026-07-09 17:31:48 +08:00
2026-07-10 19:23:12 +08:00
2026-07-22 10:53:21 +08:00
2026-07-22 15:42:25 +08:00
2026-06-10 18:32:51 +08:00
2026-06-07 23:17:27 +08:00
2026-07-17 21:49:10 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 23:17:27 +08:00
2026-06-07 03:31:35 +08:00
2026-05-27 21:04:03 +08:00
2026-06-01 21:29:52 +08:00
2026-05-27 21:04:03 +08:00
2026-06-14 01:24:29 +08:00
2026-06-16 01:25:57 +08:00
2026-06-14 01:24:29 +08:00
2026-06-14 01:24:29 +08:00
2026-06-15 18:07:32 +08:00
2026-05-27 21:04:03 +08:00
2026-06-10 22:27:06 +08:00
2026-05-27 21:04:03 +08:00
2026-06-06 18:52:42 +08:00
2026-05-27 21:04:03 +08:00
2026-05-27 21:04:03 +08:00
2026-06-06 04:51:50 +08:00
2026-06-09 01:56:37 +08:00