用 Tablestore 存 SerpBase 快照:主键顺序比字段更重要

简介: 本文分享Tablestore建表踩坑经验:首版误用无序request_id作主键,导致按关键词+时间查询需全表扫描;后重构为(keyword, day, request_id)有序复合主键,精准支持核心查询路径,并采用按月分表、映射表解耦、原文存储等策略,凸显宽列数据库中主键设计对查询性能的决定性影响。(239字)

第一版主键就错了

第一版表是这么建的:主键 request_id,属性列放 keyword、day、status、credits_charged 和整段 payload。

写入很顺:SerpBase 一次网页搜索 1 credit,响应原样落库。等到要查「某个关键词最近 30 天的排名」时,问题来了:Tablestore 只能按主键做范围扫描,request_id 是无序的,按 keyword + day 查等于全表扫。

那一刻我才意识到,这张表的查询方式在建模时就被主键定死了——字段可以后加,主键顺序不行。

为什么选 Tablestore

快照数据有三个特点:写多读少、按时间范围查、单条记录比较大(整段 JSON)。关系库能存,但按天分区、冷热分离、扩容都要自己操心。

Tablestore 的模型刚好贴合:宽列、主键有序、按范围扫描、按量计费。它不是分析型数据库,做聚合不如 OLAP,但做「按关键词 + 时间取快照」这件事很顺手。

主键顺序决定查询方式

改成三列主键:

keyword (STRING) | day (STRING) | request_id (STRING)

顺序不是随便排的。Tablestore 的主键是有序的,范围扫描从第一列开始匹配:

  • 按 keyword 查一段时间 → 前两列就能定位
  • 按 day 扫全站 → 第一列不是 day,只能扫全表(如果要这个查询,得另建索引表或换主键顺序)
  • 按 request_id 点查 → 单独建一张「request_id → keyword/day」的映射表

这就是取舍:一张表只能优化一种主要查询。我们选的是「关键词 + 时间」,因为这是报表和排障最常用的路径。

建表和写入大致是这样(SDK 细节以阿里云文档为准):

from tablestore import (
    OTSClient, TableMeta, TableOptions, ReservedThroughput,
    CapacityUnit, Row,
)

client = OTSClient(endpoint, ak_id, ak_secret, instance_name)

client.create_table(
    TableMeta("serp_snapshots", [
        ("keyword", "STRING"),
        ("day", "STRING"),
        ("request_id", "STRING"),
    ]),
    TableOptions(),
    ReservedThroughput(CapacityUnit(0, 0)),
)

row = Row(
    [("keyword", "serp api"), ("day", "2026-09-21"), ("request_id", data["request_id"])],
    [
        ("status", data["status"]),
        ("credits", data.get("credits_charged")),
        ("payload", json.dumps(data, ensure_ascii=False)),
    ],
)
client.put_row("serp_snapshots", row)

credits_charged 允许为空,所以写入时不要 int() 强转——null 就是未知,落库也要保留这个语义。

三种查询

按关键词取一段时间的快照:

from tablestore import Direction, INF_MIN, INF_MAX

start = [("keyword", "serp api"), ("day", "2026-09-01"), ("request_id", INF_MIN)]
end = [("keyword", "serp api"), ("day", "2026-09-30"), ("request_id", INF_MAX)]

rows = client.get_range(
    "serp_snapshots", Direction.FORWARD, start, end,
    ["status", "credits", "payload"],
)

按 request_id 点查:走映射表,一次 get_row。

按天统计:不在这张表上做。把当天的数据同步到 AnalyticDB 或 MaxCompute 跑聚合,Tablestore 只负责存和取。

这个分工很重要——用宽列库做 GROUP BY,最后一定会难受。

保留策略:按月建表

快照会一直长。我们的做法是按月建表:serp_snapshots_202609、serp_snapshots_202610。查询时按月份路由,过期月份整表归档到 OSS,再删表。

好处是保留策略变成表级操作,不用逐行删除;坏处是查询要自己拼表名,跨月查询得合并结果。对快照这种「按时间看」的数据,这个代价可以接受。

一个当时没想清楚的问题

payload 到底存整段 JSON,还是只存解析后的模块?我们最后存了整段——因为解析规则会变,原文是唯一能回放的东西。代价是存储变大,但省下了「解析错了只能重采」的风险。

如果重来

我会在第一版就把三件事定下来:主键顺序、按月分表、映射表。第一版只错了主键顺序,代价是重写了一遍写入逻辑和两张查询表。

Tablestore 的模型与计费方式见 阿里云官方文档;SerpBase 的响应字段见 SerpBase 文档。主键顺序这件事,建表前多想十分钟,比上线后改一周划算。

相关文章
|
4天前
|
缓存 JSON 监控
别让前端直连 SerpBase:用阿里云 API 网关做统一出口
前端直连 SerpBase 存在密钥泄露与QPS超限风险。通过阿里云API网关统一出口,实现Key下沉、按App/用户限流、参数白名单校验及短TTL缓存,保障安全、可控、降本。客户端仅需网关凭证,业务状态透传不丢错。
|
17天前
|
存储 运维 监控
把定时采集搬到阿里云函数计算:Serverless 跑搜索数据的完整实践
本文详解如何将低频定时采集任务(每日仅运行几十秒)从传统服务器迁移至阿里云函数计算(FC),采用“定时触发器+函数+OSS”无服务器架构。涵盖代码实现、安全配置(环境变量+服务角色)、存储选型、幂等设计、观测告警及六大典型踩坑,显著降本增效。(239字)
|
1天前
|
数据采集 人工智能 自然语言处理
2026年AIGEO从流量到可信度的演进趋势
核心结论:2026年,生成式引擎优化的竞争焦点正从“谁能让品牌出现在AI答案里”转向“谁能让品牌被稳定采信”,流量套利的边际收益在收窄,可信度工程成为决定长期效果的主变量。 这个判断不是对风口的猜测
50 2
|
1天前
|
人工智能 缓存 自然语言处理
手机 AI Agent 的成本账:一次「帮我点杯咖啡」,端侧和云端各花多少钱?
拆解手机AI Agent的成本结构:钱主要花在云端大模型调用,感知与执行可本地化;端云分工(能本地做的不上云、敏感操作本地化)是压成本、解决信任的关键。
|
1天前
|
数据采集 人工智能 黑灰产治理
1688新品指数分的评估逻辑拆解:五维加权模型如何改变发品决策
1688新品指数分(满分5.0)首次量化新品期(30天)表现,以“四个真”保障数据真实,按发品前、新品期内、日常经营三阶段锁定评分,强调动作前移;附加服务为开关型加分项,运费模板合规具否决权。助力商家提升决策确定性与流程效率。
|
1天前
|
人工智能 自然语言处理 前端开发
GEO优化迟迟不出效果怎么办:从判定口径到八步排查
本文系统解析生成式引擎优化(GEO)失效的根源,指出“没效果”常源于测量偏差或排查顺序错误。强调先固化提示集、分平台测“出现率”而非排名;再查抓取可达性;继而优化段落自足性与证据密度;最后补位国内主流模型偏好的第三方信源。八步清单明确动作、标准与止损线,破除关键词堆砌、刷日期等常见误区。
34 1
|
1天前
|
人工智能 自然语言处理 API
阿里云Token Plan最详细介绍:个人版与团队版区别、套餐优惠价格、最新活动参考
Token Plan 是千问AI平台推出的 AI 大模型订阅服务,以 Credits 统一计量,一份订阅即可在 Claude Code、Cursor、Qwen Code、Qoder 等主流编程与智能体工具中调用文本、图像、视频、语音等多模态模型及联网搜索、代码解释器等内置工具。产品分为个人版与团队版:个人版设 Lite、Essential、Standard、Pro 四档,Standard 与 Pro 附赠 Harness 权益;团队版按标准、高级、尊享三档席位订阅,支持多席位管理与用量分析,承诺不使用数据训练模型。两者均可购买加油包补充额度,并叠加夜间折扣及多项优惠活动,兼顾灵活性与成本控制。
|
1天前
|
监控 测试技术
接口字段的类型、单位与可空性:契约校验的三道闸
上游把金额从「元」改成「分」,本地测试全部通过、灰度后对账差一百倍。本文给出字段层契约的三道闸(契约校验、解析层无兜底、隔离区)与一个结构指纹探针,附验收标准四条。
|
1天前
|
传感器 人工智能 Linux
“主协配合“系统级设计:当专用 AI ISP 遇上通用 SoC
前两篇文章我们分别深入解读了 CSA(列共享架构)和 NMC(存算一体)技术。今天我们从系统级视角,讨论一个关键问题:**专用 AI ISP 如何与通用 SoC 协同工作?** 这不是简单的"两颗芯片连在一起"。从接口设计、数据流管理、功耗域划分到软件栈适配,系统级设计决定了"主协配合"架构能否真正发挥 1+1>2 的效果。
|
1天前
|
人工智能 自然语言处理 小程序
我是如何用万小智一句话帮我自动部署微信小程序的?小程序应用部署教程
万小智2.0是阿里云推出的AI建站工具,支持自然语言对话生成微信小程序:输入需求→自动生成PRD→构建应用→预览编辑→一键发布。全流程可视化+AI辅助,零代码快速上线。阿里云万小智AI建站官网:https://t.aliyun.com/U/FmBHHe

热门文章

最新文章