用 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 文档。主键顺序这件事,建表前多想十分钟,比上线后改一周划算。

相关文章
|
2天前
|
人工智能 搜索推荐 API
AI做小工具被调1亿次:截图API一人公司月入21万
这是一个“无聊却硬核”的一人公司案例:工程师2022年 solo 创立截图API,零融资、零员工,4年调用破1亿次,月入21.5万元(3.2万美元),50-60%收入来自SEO长尾流量。不靠广告,靠精准内容获客;不靠风口,靠深耕基础设施需求。但9%月流失率暴露增长天花板——本文深度拆解其选赛道、做搜索、管流失、换分发的闭环打法,揭示普通人可复用的“无聊生意”生存逻辑。(239字)
|
5天前
|
缓存 JSON 监控
别让前端直连 SerpBase:用阿里云 API 网关做统一出口
前端直连 SerpBase 存在密钥泄露与QPS超限风险。通过阿里云API网关统一出口,实现Key下沉、按App/用户限流、参数白名单校验及短TTL缓存,保障安全、可控、降本。客户端仅需网关凭证,业务状态透传不丢错。
|
2天前
|
Windows
ReNamer 文件批量重命名使用教程
面对几百个命名混乱的文件,手动逐个改名不仅效率低下,还容易出错。ReNamer是一款功能强大且免费的Windows批量重命名工具,它的核心思路是“先建规则,再预览,最后执行”,让批量改名变得可控且可重复。下面从界面操作到规则运用,逐步介绍它的使用方法。下载地址公中浩:贝壳资源库,按提示下载。认识界面与操作顺序打开ReNamer后,界面分为上下两个主要区域。上
63 0
ReNamer 文件批量重命名使用教程
|
2天前
|
人工智能 自然语言处理 安全
AI搜索品牌提及从哪来?语料来源解析
AI 搜索的品牌提及,主要来自大模型可召回、可核验的公开语料:官方站点与权威媒体的交叉印证是主信源,短视频、百科类结构化内容与垂直社区内容是补充信源。很多企业主发现,豆包、DeepSeek、文心一言在
60 0
AI搜索品牌提及从哪来?语料来源解析
|
1天前
|
存储 JSON NoSQL
SerpBase 快照存 Tablestore,统计放 AnalyticDB
一张表难兼存储与统计:Tablestore 擅长按主键查快照,但聚合乏力;AnalyticDB 专精列式扫描与多维统计。按访问模式拆分——Tablestore 存原始响应(keyword+day+request_id),ADB 存摊平字段做聚合,查询提速、架构更稳。(239字)
|
2天前
|
机器学习/深度学习 弹性计算 人工智能
阿里云 GPU 云服务器一年多少钱?10月28日轻量应用服务器最新价格行情?
阿里云GPU云服务器(EGS)2026年更名,年费从¥5,000(T4)至¥100,000+(H系列)不等;轻量应用服务器低至¥38/年(2核2G),适合个人建站与开发。价格因配置、地域及活动浮动,建议官网实时测算。
39 0
|
2天前
|
SQL 存储 Java
LikeShop 多商户高级版商城满减满赠活动的自定义规则二开实现
本文针对LikeShop多商户高级版,提出轻量、可配置的满减满赠二开方案:通过独立活动体系、统一计算入口与事件联动分账,支持平台/商家双层级、多档阶梯规则、智能分摊及精准退款回退,最小侵入实现灵活营销,保障账务准确。
25 0
|
2天前
|
SQL 前端开发 Java
LikeShop 连锁点餐系统套餐组合与加料功能的二开改造
本文基于LikeShop连锁点餐系统,提出轻量级二开方案:通过新增扩展表(套餐/加料模型)、复用原生订单与库存底座,实现固定/自选套餐、分组加料(支持库存联动与价格配置),保障全链路库存扣减、后厨明细打印及平滑升级,侵入极小、落地高效。
24 0
|
2天前
|
存储 JSON API
ComfyUI‑SD 图生图工业化流水线构建:生成资产元数据治理、批量推理调度与协作交付审计方案
本文提出SD图生图资产标准化治理方案,直击ComfyUI工程化落地痛点:工作流不可复现、资产无版本管理、GUI操作低效、资产孤岛及交付无审计。通过四大资产域划分、标准化目录Schema与五大治理原则,结合批量推理调度与交付审计双模块脚本,实现生产基线锁定、依赖显性化、元数据留存与交付可追溯,助力中小美术团队工业化升级。(239字)
|
2天前
|
人工智能 测试技术
网页任务技能怎样维护版本与验收样本
网页任务技能维护时,建议保留版本、变更原因和验收样本。寻答AI浏览器支持以指令和文件表达常用流程,由AI按需调用复用,适合把反复出现的任务要求保存下来。本文中的版本记录是使用者自建方法,不表示产品已内置完整版本管理系统。

热门文章

最新文章