

"欧美黄页检索速度慢"通常分两种情况——你是在访问(浏览)欧美黄页网站慢,还是你在开发/运维黄页类目录网站、后端搜索接口慢。下面分别给你对应的优化思路:
这种情况通常是跨境网络延迟、DNS 解析慢、服务器离你远导致的。
DNS 层面
把本地 DNS 改成 1.1.1.1(Cloudflare)或 8.8.8.8(Google),解析速度通常会快不少。如果是企业环境,可以配内网 DNS 转发器指向这些公共 DNS。
网络链路层面
跨境访问的核心问题是路由绕路。企业可以用 SD-WAN 或专线来改善;如果是个人使用,确保你用的代理节点选的是美西或欧洲本地节点,延迟会低很多。另外可以试试用 ping 和 traceroute 看一下具体卡在哪个跳点,有时候换一个出口运营商就能解决。
浏览器层面
Chrome 设置里打开"预加载页面"功能,让浏览器提前解析可能访问的地址。把不常用的插件关掉,尤其是那些会注入脚本的广告拦截工具如果规则太多也会拖慢页面。清一下历史缓存,有时候旧的 DNS 缓存和 Cookie 反而会造成重复重定向。
站长视角(如果你是运营方)
给网站套 Cloudflare CDN,静态资源(图片、CSS、JS)走边缘节点就近分发,欧美不同地区的用户都能受益。动态内容也可以用 Cloudflare 的 Argo Smart Routing 来优化回源路径。图片尽量转 WebP 格式,开启懒加载,黄页网站商家图片多,这一项优化效果很直观。
黄页类网站的本质是按行业、城市、商家名做组合筛选和模糊匹配,数据量一大,最典型的瓶颈就是数据库全表扫描。
数据库查询优化
首先一定要对高频筛选字段建索引。城市、行业分类、商家名称这三个字段几乎是每次搜索都会用到的,单独建 B+Tree 索引是基础操作。如果是多条件组合查询,建联合索引时要注意把区分度高的字段放前面,这样索引命中率更高。
最大的坑是 LIKE 模糊查询。很多黄页网站的搜索用的是 WHERE name LIKE '%keyword%',这种写法无论怎么建索引都是全表扫描,数据量过十万条就会明显变慢。解决办法有两个方向:一是用 MySQL 自带的 FULLTEXT 全文索引配合 MATCH AGAINST 语法,能走索引而且支持相关性排序;二是直接引入专门的搜索引擎比如 Elasticsearch 或 Meilisearch,把商家数据同步过去,搜索性能和功能(拼写纠错、同义词、权重排序)都会上一个台阶。
另外一个常见问题是 SELECT * 。很多开发者图省事直接查全部字段,但黄页表往往有很多描述性的长文本字段,全部查出来既占 IO 又占内存。只查列表页真正需要的字段(ID、名称、城市、电话、评分)就够了,详情页再单独查完整信息。
分页也要小心。OFFSET 翻到后面几万条的时候会非常慢,因为数据库还是要扫描前面所有行。推荐用游标分页,比如 WHERE id > last_id LIMIT 20,性能稳定不受页码深度影响。
缓存策略
热点数据是最好优化的地方。城市列表、行业分类树这些几乎不变的数据,直接放 Redis 或者前端 LocalStorage,根本不用碰数据库。热门搜索词的结果也可以缓存 5 到 30 分钟,比如用户搜 "restaurant New York",这个查询结果在短时间内被重复请求的概率很高,命中缓存就直接返回。
如果某些页面的访问量特别大,可以考虑用 CDN 的边缘缓存来缓存整个 HTML 页面,但要注意登录态和个性化内容的处理。
架构层面
数据量真的很大的话,可以考虑按地区分表,比如北美一张表、欧洲一张表,搜索时只查对应地区的表。也可以把搜索专用的读表和主业务写表分开,搜索表专门做索引优化,不影响主表的写入性能。
前端体验优化
搜索框加防抖,用户停止输入 300 毫秒后再发请求,避免每敲一个字母就打一次接口。搜索结果没回来之前先展示骨架屏或者 loading 状态,不要让页面白屏。搜索建议(autocomplete)可以单独做一个轻量接口,只返回前十条匹配的商家名,响应要快很多。
第一步先用 EXPLAIN 分析你的搜索 SQL,看看是不是全表扫描,如果是,先加索引或者改全文索引。
第二步给热点查询结果加 Redis 缓存,这一步通常能解决 70% 的性能问题。
第三步如果数据量和并发继续涨,就把搜索迁移到 Elasticsearch。
第四步确认 CDN 和静态资源压缩已经到位。
