先用慢查询日志和explain定位sql瓶颈,再优化索引、避免select*和函数索引失效,结合php层批量操作与redis缓存,才能真正提升接口响应速度。

接口数据响应慢,八成不是PHP本身的问题,而是数据库成了瓶颈。PHP 8.3 再快,也得等 MySQL 返回结果——所以优化数据库,是让接口“真正变快”的关键一步。
先确认是不是数据库拖慢的
别急着调参数,先定位问题:
- 用 MySQL 慢查询日志(slow_query_log=ON,long_query_time=1)抓出执行超 1 秒的 SQL
- 对慢 SQL 跑 EXPLAIN,看是否走了索引、有没有 Using filesort 或 Using temporary
- 在 PHP 接口里用
microtime(true)包住 DB 查询段,单独测耗时——如果单次查询就占了 800ms,那其他优化都是白搭
SQL 和索引必须精调
很多慢接口,根源是“查得多、写得糙”:
- 避免 SELECT *:只取需要字段,减少网络传输和内存拷贝,尤其别带大文本或 JSON 字段
-
WHERE 条件列必须建索引:比如
WHERE status = 1 AND created_at > '2026-09-01',要建联合索引(status, created_at),顺序不能反 -
别在索引列上用函数:如
WHERE DATE(created_at) = '2026-09-27'会失效索引,改成created_at BETWEEN '2026-09-27 00:00:00' AND '2026-09-27 23:59:59' -
分页别用 OFFSET 大数:查第 10000 页?改用游标分页(
WHERE id > ? ORDER BY id LIMIT 20)
连接与查询方式要改
PHP 层的写法直接影响数据库压力:
-
禁用 PDO 持久连接:ThinkPHP8 或原生 PDO 中设
PDO::ATTR_PERSISTENT => false,PHP-FPM 进程复用下持久连接易导致连接泄漏和 wait_timeout 错误 - 单请求内复用连接:别在 foreach 里反复 new PDO;用单例或依赖注入确保一次请求只连一次库
-
批量操作代替循环:100 条 INSERT 别写 100 次,用
INSERT INTO t (a,b) VALUES (1,2), (3,4), ...一条搞定 - 读写分离谨慎启用:除非真有报表类重读场景,日常 API 统一走主库,避免路由判断开销和主从延迟引发数据不一致
加缓存,绕过数据库
不是所有数据都必须实时查库:
-
高频只读数据上 Redis:用户资料、配置项、地区列表等,用
Cache::get('user:profile:'.$uid),key 带业务前缀 + 版本号(如user:profile:v2:123) - 绝不缓存 null 或空数组:防止缓存穿透,查不到时设个短过期(如 60 秒)的空标记
-
缓存粒度要合理:别缓存整页 HTML,优先缓存「数据层」,比如
getOrderList($uid)的返回数组,前端再拼结构
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











