备案站点的慢查询定位与索引优化
作者:备案源头内容团队内容审核:备案源头内容团队更新于 2026年9月15日
先定位,再优化
「站点变慢」的排查顺序里,数据库几乎永远是第一嫌疑人。但直接凭感觉加索引是最低效的做法——真正的瓶颈往往只有两三条 SQL,找到它们比优化十条无关查询有用得多。
关键要点
- 优化从慢查询日志与执行计划开始,不从「我觉得这里慢」开始。
- 索引失效大多不是缺索引,而是写法让索引用不上。
- 覆盖索引能免掉回表,对高频查询收益最大。
- 索引不是越多越好:每个索引都会让写入变慢、占用空间。
第一步:把慢的那几条找出来
开启慢查询日志并设定阈值(例如 200 毫秒),运行一段时间后按总耗时而不是单次耗时排序——一条 50 毫秒但每秒执行 500 次的查询,危害远大于一条 2 秒但每天只跑一次的报表。
拿到候选 SQL 后看执行计划,重点关注三件事:是否走了索引、扫描行数与返回行数的比例、是否出现临时表或文件排序。扫描 10 万行只返回 10 行,就是典型的索引选择问题。整体压测与瓶颈定位方法见 性能优化与压测。
索引用不上的五种典型写法
| 写法 | 为什么失效 | 改法 |
|---|---|---|
在列上套函数,如 DATE(created_at)=… |
索引存的是原值 | 改成范围查询 >= … AND < … |
| 隐式类型转换,字符串列传数字 | 触发全表转换比较 | 类型对齐 |
前导通配 LIKE '%关键词%' |
无法定位起点 | 用全文检索或搜索引擎 |
| 联合索引跳过前导列 | 最左前缀原则 | 调整索引列顺序 |
OR 连接不同列 |
难以合并索引 | 拆成 UNION ALL 或补索引 |
联合索引的列顺序要按「等值条件在前、范围条件在后」排列,范围条件之后的列无法再用于索引定位——这是联合索引最容易被浪费的地方。
覆盖索引与回表
普通二级索引命中后还要回主键索引取完整行,这一步叫回表。如果查询需要的列都包含在索引里,就可以直接从索引返回结果,省掉回表的随机 IO。对高频接口,把 SELECT * 收敛成只查需要的几列,再配一个覆盖索引,效果往往比换硬件明显。这也是为什么 SELECT * 在热点路径上是个坏习惯。
深翻页:LIMIT 100000, 20 的陷阱
这条语句要求数据库先扫描并丢弃前 10 万行,页码越大越慢。改造方式:
- 游标分页:记住上一页最后一条的排序键,下一页用
WHERE id > 上次最大值 ORDER BY id LIMIT 20,耗时与页码无关。 - 延迟关联:先用覆盖索引查出这一页的主键,再回表取完整行。
- 对外接口直接限制最大可翻页数,后台导出走异步任务,见 消息队列与异步任务运维。
索引的代价
每加一个索引,写入时就要多维护一棵树,同时占用磁盘与内存缓存。常见的收敛做法:删掉长期零命中的索引、合并前缀重复的索引((a) 可被 (a,b) 覆盖)、避免在低区分度列(如状态、性别)上单独建索引。
加索引本身也是一次高风险变更
大表加索引可能锁表或引发主从延迟,必须按在线变更流程执行,见 数据库变更与在线 DDL 实践。变更窗口内要盯住连接数与复制延迟,见 数据库运维与高可用。
优化之外:缓存与连接
不是所有慢查询都该靠索引解决。读多写少的热点数据更适合缓存,见 缓存与 Redis 运维;而当慢查询导致连接被长期占用时,还要同步检查连接池配置,见 数据库连接池与连接数治理。
常见坑
- 凭感觉加索引:索引堆了一堆,慢的那条还是慢。
- 只看单次耗时:忽略了高频小查询的总开销。
- 索引列上套函数:索引形同虚设。
- 深翻页不改造:后台列表页越往后越卡。
- 测试数据量太小:在一千行的表上什么方案都快。
常见问题
慢查询日志阈值设多少合适?
先设一个能筛出明显问题的值(如 500 毫秒)看整体情况,再逐步调低到 100~200 毫秒做精细优化。阈值太低会记录大量正常查询,反而增加磁盘压力。
为什么加了索引还是不走索引?
常见原因有三个:写法导致索引失效;优化器认为全表扫描更划算(通常出现在表很小或筛选后行数占比很高时);统计信息过期导致估算失真。先看执行计划再判断。
能不能给每个查询条件都建索引?
不建议。索引会拖慢写入、占用存储,过多索引还会让优化器选错。更有效的做法是用少量联合索引覆盖高频查询组合。
报表类的慢查询也要这样优化吗?
报表更适合分离处理:走只读从库或离线数仓,避免和在线业务抢资源。在主库上优化一条每天跑一次的报表,性价比很低。
资料来源
MySQL、PostgreSQL 官方文档中关于索引结构、执行计划与慢查询日志的公开说明,以及覆盖索引、游标分页等通用数据库优化实践。本文为通用运维说明,仅供参考,具体以实际数据库版本与数据分布为准。
相关阅读
网站访问日志留存与安全合规运维要点
为什么要留日志:这是法定要求 《网络安全法》第二十一条明确要求网络运营者"采取监测、记录网络运行状态、网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月"。已完成备案、对外提供服务的网站属于网络运营者范畴,日志留存不是可选项,而是基础合规义务。 应留存哪些日志 | 日志类型 | 记录内容 | 主要用途 …
网站新增域名如何补充接入备案
企业在原有网站基础上新增域名,比如启用新的品牌域名或拼音域名指向同一网站时,不能直接绑定使用,而是需要在原备案基础上补充办理新增域名的接入手续。 新增域名前的准备工作 新增域名前,建议先确认该域名已经完成实名认证,可以通过 Whois查询 核对域名的注册信息和实名状态,避免因域名信息未实名导致接入申请被退回。同时确认…
备案信息年度核查该如何配合应对
部分省份的通信管理部门会对辖区内已备案网站开展年度或不定期核查,核查方式包括系统比对、电话回访、短信确认等,目的是确认备案信息与网站实际运营情况是否一致。 核查通常关注哪些内容 年度核查一般围绕主体信息、网站信息、接入信息三个维度展开,具体可以对照下表自查: | 核查维度 | 常见核查点 | | --- | --- …
备案号在网站上的规范展示与使用要求
网站完成备案只是第一步,备案号在页面上的展示方式同样需要长期维护,很多主体正是因为展示细节不规范,在日常巡查或年度核查中被要求整改。 展示位置与基本要求 通常做法是将备案号放置在网站首页底部,文字需清晰可辨、不被图片或广告遮挡,且格式应与下发的备案号文本保持一致,不能随意增减字符或调整顺序。是否需要加超链接指向查询入…
备案注销之后重新申请要注意什么
有些主体在此前因业务调整、接入商变更等原因注销了原有备案,之后又因新的业务需要重新申请备案。这种“二次备案”与首次备案在流程上大体相似,但有几个环节容易被忽略。 重新申请前的自查 重新申请前,建议先用 ICP备案查询 确认原备案是否确实已经完成注销,避免出现原备案未彻底清空、新申请与旧记录冲突的情况。同时检查计划使用…
备案信息变更有没有时效要求
备案不是办理完成后就一劳永逸的事项,主体信息、网站信息或联系方式一旦发生变化,通常需要在信息变化后的一定时间内完成变更提交,具体时限以属地管局要求为准。 哪些变化需要及时申报 常见需要变更的情形包括:主办单位名称或证件信息变化、网站负责人更换、联系电话或邮箱失效、网站域名调整、网站内容服务类型发生实质变化等。这类变更…
公司迁址之后备案地址信息如何更新
企业办公地址或注册地址发生变化后,备案信息中登记的地址项也需要相应更新,尤其是当迁址涉及跨区、跨市甚至跨省时,办理流程会比同城内迁址更复杂一些。 迁址后需要关注的信息 迁址后首先要确认工商登记信息是否已经完成同步变更,备案地址一般以工商登记的最新地址为准。可以先用 ICP备案查询 查看当前登记的主办单位地址,与最新的…
备案预留手机号邮箱变更该如何更新
备案信息中登记的手机号和邮箱,是管局与接入服务商联系网站负责人的主要渠道,用于发送核查通知、验证短信、审核结果等重要信息。这些联系方式一旦更换却未同步更新,容易导致关键通知被漏收。 常见需要更新的场景 负责人更换手机号或离职导致原号码停用; 企业邮箱系统迁移,原邮箱地址不再使用; 备案负责人变更,联系方式随之更换。 …