UPDATE comments c JOIN ip_geo g
  ON INET_ATON(c.ip) BETWEEN g.ip_start AND g.ip_end
SET c.region = g.province
WHERE c.region IS NULL;

新规要求评论展示 IP 属地,上线前一天才发现评论表只有 ip 字段,没有归属地,历史几十万条评论全要现算。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:属地要靠 IP 库做映射,光存字符串算不出来,IPv6 还得单独处理。历史数据量大,逐条调在线接口既慢又会超额。

「IP 属地展示」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

处理上按这个顺序:本地挂一份离线 IP 库,按段匹配查询,别逐条请求外部接口;评论入库时把属地和 IP 一起写进去,展示只读属地字段;历史数据写脚本批量回填,只存省份,不存具体城市。

确认没问题再收工,随机抽十条旧评论,前台显示的省份与离线库结果一致,IPv4 和 IPv6 各测一条。

作者 9823189