把千万级 Google Ads 标题的模糊查询从 6 秒压到 0.6 秒,我做了什么?

查看 15|回复 0
作者:fantexi178   


发布摘要:SiteData 原来一次 Google Ads 标题模糊查询最快也要约 6 秒,我最后把搜索层换成 Manticore ,把查询压到约 0.6 秒,也让免费的 Ads 投放站点数从手动触发变成可以自然展示。

大家好,我是饭特稀。
最近给 SiteData 做了一次性能优化。
这次优化不是为了让页面看起来更快一点,而是为了解决一个非常具体的问题:
千万级以上 Google Ads 标题和关键词数据,怎么做到可以实时模糊查询?
其实之前这个功能已经有了。
比如你在 Google 搜索一个关键词,SiteData 插件会在搜索结果页里显示这个关键词最近 4 周大概有多少家网站在投放相关广告。

在插件里的热门关键词模块,也会显示每个关键词对应的 Ads 数量。
这里的数字不是搜索量,也不是 CPC 。
它更接近一个广告竞争信号:
最近 4 周,有多少个网站围绕这个关键词投过 Google Ads 。

还有一点需要说明:
这个最近 4 周指定关键词投放站点的功能,目前是免费给用户看的。
它也不是一个只能看一眼的静态数字。
用户可以直接点击这个数字,进入 SiteData 的 Google Ads Analysis 详情页,看最近 4 周有哪些网站在围绕这个关键词投放广告。
详情页里会列出相关站点、广告主、流量、DR ,以及进一步查看域名分析的入口。
比如下面这个关键词,最近 4 周匹配到了 59 个相关投放站点:

这个信号对做 SEO 、AFF 、media buying 、网站增长的人很有用。
因为搜索量只能说明有人搜。
但有人持续投广告,说明另一个问题:
这个关键词背后,可能已经有人愿意花真钱验证。
当然,这不代表一定赚钱。
但它比单纯看搜索量更接近商业行为。
一开始为什么没有默认展示
这个功能之前没有默认打开。
原因也很简单:太慢。
SiteData 后面有大量 Google Ads 数据,其中广告 title 、description 、keyword 这类字段非常适合做模糊查询。
但问题是,数据量到千万级以后,传统 MySQL 直接查广告 title ,哪怕做了基础优化,一次查询最快也要 6 秒左右。
6 秒是什么概念?
如果只是后台手动查一次,可以忍。
如果是用户打开 Google 搜索页,每个关键词都要等这个结果,那就不行。
所以之前我只能做成手动触发:
用户真的想看这个广告信号时,再点一下按钮。
这不是我理想中的体验。
很多 SiteData 用户其实对这个数据有需求。
他们不是想多点一个按钮,而是希望在判断关键词、分析竞品、看广告机会时,这个信号默认就在旁边。
问题就变成了:
能不能把一个原本只适合手动触发的慢查询,变成一个可以常态化展示的实时查询?
继续压 MySQL ,不是最划算的路
一开始最自然的想法,肯定还是继续优化 MySQL 。
加索引、拆表、缓存、预计算,这些都可以做。
但这次的问题有点特殊。
我要查的不是一个精确字段,也不是简单的 domain = xxx.com。
更常见的是:
  • title 里是否包含某个关键词
  • 用户输入的关键词和广告标题是否接近
  • 再叠加国家、语言、时间范围等过滤
  • 最后还要统计最近 4 周有多少网站投过广告

    这类查询,本质上已经不是 MySQL 最舒服的场景了。
    MySQL 仍然适合做业务主数据库。
    用户、订单、会员、广告主关系、任务状态,这些数据应该继续放在 MySQL 。
    但广告 title 的全文搜索和模糊匹配,最好交给专门的搜索引擎。
    所以我开始重新调研搜索方案。
    常见选择当然是 Elasticsearch / OpenSearch 。
    它们很成熟,生态也很强。
    但对我这个阶段来说,ES 的问题也很明显:重。
    JVM 、heap 、shard 、refresh 、集群运维,这一整套东西当然有价值,但如果只是为了把几千万条广告标题搜快一点,上来就用 ES ,多少有点提前交架构税。
    后来我选了一个相对小众的开源搜索数据库:Manticore Search

    为什么最后选 Manticore
    我选 Manticore ,不是因为它名气最大。
    恰恰相反,它没有 Elasticsearch 那么出圈。
    但它很适合 SiteData 当前这个场景。
    SiteData 这里需要的是:
  • 千万级以上广告标题全文搜索
  • 模糊匹配
  • 按国家、语言、时间过滤
  • 按网站或广告主做统计聚合
  • 服务器成本不能太夸张
  • 开发接入最好不要太复杂

    Manticore 的几个特点刚好对上了。
    第一,它是 C++ 写的,资源占用比较克制。
    第二,它支持 SQL 和 MySQL 协议。
    这点对开发体验很重要。
    你可以用类似这样的方式理解查询:
    SELECT *
    FROM google_ads
    WHERE MATCH('ai image generator')
    AND country = 'US'
    ORDER BY last_seen DESC
    LIMIT 100;
    这比一上来写一大段 ES DSL 更直接。
    第三,它适合做搜索层,而不是替代业务数据库。
    我现在更倾向的架构是:
    MySQL
      负责用户、订单、会员、业务状态
    Manticore
      负责 Google Ads title 、description 、keyword 的全文搜索、模糊查询、过滤和聚合

    也就是说,MySQL 仍然是业务事实来源。
    Manticore 专心做一件事:把搜索变快。
    上线后的结果
    这次上线以后,最直观的变化是:
    原来 MySQL 查一次最快约 6 秒。
    现在一条广告标题模糊查询,大概 0.6 秒就能返回。
    从用户体验上看,这个差别非常大。
    6 秒的时候,我不敢默认展示。
    0.6 秒的时候,这个功能就有机会从“手动点一下”变成“页面自然呈现”。
    为了验证它不是偶然快,我还做了分阶段压测。
    下面是压测结果:

    在这组测试里,从 1 RPS 到 50 RPS ,错误数都是 0 。
    表里的平均耗时基本在 170ms 到 180ms 左右,P95 大多在 200ms 附近。
    当然,压测数据不能简单等同于真实线上所有场景。
    真实用户请求还会受到网络、接口包装、缓存命中、数据分布、并发形态等因素影响。
    但这至少说明一件事:
    这个方向是对的。
    它不再是一个只能偶尔查一下的慢功能,而是有机会进入常规产品体验的功能。
    更让我惊喜的是资源占用
    速度变快,其实我有心理预期。
    真正让我惊喜的是资源占用。
    这是机器上的内存情况:

    总内存 8GB 左右,实际 used 只有 662MB ,可用内存还有 7GB 多。
    再看 htop:

    CPU 基本没有明显压力,load average 也很低。
    磁盘情况也比我预期轻很多:

    144G 的盘,只用了 6.3G 。
    这点对独立开发者和小团队很重要。
    很多时候,我们不是做不出功能。
    真正的问题是:
    功能一旦上线,服务器成本会不会跟着起飞?
    如果一个功能必须上更大的机器、更多节点、更复杂的集群运维,那它不只是技术问题,还是商业问题。
    这次 Manticore 给我的感觉是:
    在当前这个数据量和访问规模下,它把搜索性能和服务器成本控制在了一个很舒服的区间。
    这不是说 Manticore 一定比 ES 好
    我不想把这篇写成“某某数据库吊打某某数据库”。
    这种结论通常没什么意义。
    Elasticsearch 仍然是非常成熟的搜索基础设施。
    如果你的场景是超大规模集群、自动分片、强 HA 、复杂日志分析、成熟 ELK 生态,ES / OpenSearch 依然很有优势。
    但 SiteData 这次的问题不是搭一个企业级搜索平台。
    它的问题更具体:
    千万级到亿级广告情报数据里,如何低成本、低运维压力地做全文搜索和模糊匹配?
    在这个阶段,Manticore 更像一个务实选择。
    不追求第一天就把架构搭得很重。
    先让最痛的查询快起来。
    等真的遇到单机瓶颈、手工分片瓶颈、更多节点的 HA 需求时,再重新评估 ES / OpenSearch 。
    对 SiteData 来说,这个优化意味着什么
    这次优化以后,SiteData 的关键词广告信号可以做得更自然。
    以前用户看到一个关键词,想知道有没有人在投广告,需要额外触发。
    现在更理想的体验是:
    你在 Google 搜索一个词。
    SiteData 顺手告诉你:
  • 这个词最近 4 周,甚至 1 年以上有多少网站在投广告
  • 这些广告主是否持续出现
  • 相关网站是否还有其他关键词在投
  • 这个关键词是短期测试,还是已经有持续预算

    这对判断机会很关键。
    因为做网站增长、做 SEO 、做 AFF ,最怕的不是没有数据。
    最怕的是数据看起来很多,但离真实商业行为很远。
    搜索量是兴趣。
    CPC 是竞价结果。
    广告投放网站数,是另一层真实行为。
    它不能替你做决定,但能帮你少一点盲猜。
    这次给我的几个提醒
    第一,慢功能不一定是产品没价值。
    有些功能不是没人要,而是性能没到可以自然使用的程度。
    当一次查询要 6 秒时,用户会觉得它像一个附加工具。
    当一次查询压到 0.6 秒时,它才有机会变成产品体验的一部分。
    第二,不要什么都塞进主数据库。
    MySQL 很重要,但它不需要负责所有事情。
    业务数据归业务数据库。
    全文搜索、模糊匹配、过滤聚合,可以交给搜索层。
    第三,小团队选型要看成本。
    不是越成熟、越庞大的系统就越适合。
    如果一个小众工具刚好解决当前最痛的问题,并且资源占用低、接入成本低,那它可能就是更好的选择。
    SiteData 这次从 MySQL 慢查询迁到 Manticore ,我最大的感受是:
    技术优化最后还是要回到产品体验:原来不敢默认展示的数据,现在终于有机会变成用户每天都能用到的信号。
    相关阅读
  • SiteData 新功能:在 Google 搜索页里直接查看关键词搜索量、趋势和广告竞争度
  • 做 AFF 最怕选错方向:如何用 SiteData 找到被预算验证过的机会
  • 一个 API ,查遍对手的流量、外链和广告打法

  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部