大表优化核心是减少单次查询数据量和降低高频操作响应开销,需结合水平分表、冷热分离、索引优化、缓存与异步化等策略协同实施。

大表优化不是单纯加索引或换数据库,核心是减少单次查询的数据量和降低高频操作的响应开销。PHP 层要配合数据层做合理切分、缓存与异步处理,避免“全量查、PHP 过滤、再分页”这类典型反模式。
按时间/业务维度水平分表(Sharding)
当单表超千万行且写入持续增长时,优先考虑逻辑分片。例如订单表按年份或月份拆成 orders_2023、orders_2024;用户行为日志按 user_id % 16 分 16 张子表。PHP 中通过路由类统一决定查哪张表:
- 查询前根据参数(如时间范围、用户 ID)计算目标表名,不硬编码
- 写入时同步更新主键映射或使用雪花 ID,避免跨表主键冲突
- 聚合类查询(如总销量)改用定时任务预汇总到统计表,而非实时 UNION 多表
冷热数据分离 + 归档策略
80% 的请求集中在最近 3 个月数据,老数据可迁移至归档库或转为只读表。PHP 应用需适配双源访问:
- 读接口先判断时间条件:近实时数据走主库,历史数据走归档库(PDO 连接切换)
- 提供后台归档脚本,按批次 DELETE + INSERT INTO archive,避免长事务锁表
- 归档表保留必要字段,去掉冗余 JSON 字段或大文本,减小体积
索引优化与查询重写(PHP 层可干预)
很多慢查询源于 PHP 拼 SQL 不够严谨。重点检查:
DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。
立即学习“PHP免费学习笔记(深入)”;
- 避免
SELECT *,尤其在有 TEXT/BLOB 字段的大表中;明确指定需要的列 - 分页慎用
LIMIT 10000,20,改用游标分页(记录上一页最大 ID 或时间戳) - 联合索引要匹配最左前缀,WHERE 条件顺序和索引定义保持一致;用
EXPLAIN验证执行计划 - 对 COUNT 统计,若不要求绝对精确,可用缓存值 + 增量更新代替
COUNT(*)
引入缓存层与异步化写入
PHP 不应直面大表高压读写。常见组合方案:
- 高频读场景(如商品详情):Redis 缓存完整结构,DB 更新后主动失效或延时双删
- 写多读少场景(如日志上报):PHP 将数据发到消息队列(RabbitMQ/Kafka),由消费者批量写入 DB
- 复杂报表导出:前端触发任务,后台生成 CSV 后存对象存储,返回下载链接,不阻塞 Web 请求
重构过程建议从慢查询日志切入,用 pt-query-digest 定位 TOP10 耗时 SQL,逐个分析执行计划与 PHP 调用上下文。每次改动后用真实流量压测对比 QPS 和平均响应时间,不追求一步到位,但每轮都要可验证、可回滚。










