合理设计表结构是性能基础,字段类型需精确匹配业务需求,索引应恰到好处(单表5–7个),读写分离与分表按需落地,php层需配合pdo优化与缓存策略。

合理设计表结构是性能基础
字段类型要精确匹配业务需求,避免用 TEXT 存短文本、用 BIGINT 存状态码。枚举类字段优先用 TINYINT + 注释说明,而非字符串;时间字段统一用 DATETIME 或 TIMESTAMP(注意时区一致性);所有主键默认使用 unsigned BIGINT AUTO_INCREMENT,预留高并发扩展空间。
索引不是越多越好,而是恰到好处
单表索引总数建议控制在 5–7 个以内。重点覆盖:
- WHERE 条件中的高频字段(含组合条件顺序,遵循最左前缀原则)
- ORDER BY 和 GROUP BY 字段(避免 filesort)
- JOIN 关联字段(尤其外键列必须有索引)
定期用 EXPLAIN 分析慢查询,关注 type=ALL 或 key=NULL 的情况;删除长期未被命中的冗余索引,可通过 performance_schema.table_io_waits_summary_by_index_usage(MySQL 8.0+)辅助判断。
读写分离与分表策略按需落地
单库 QPS 超过 1500 或慢查率 > 3%,就该考虑拆分:
- 读多写少场景:用 MySQL 主从 + 中间件(如 ProxySQL、MaxScale)做自动读写分离
- 单表数据超 500 万行或容量超 2GB:优先垂直拆分(按业务域拆表),再评估水平分表(如按 user_id 取模或范围分片)
- 分表后务必统一处理:全局唯一 ID(推荐雪花算法或数据库号段池)、跨分片 JOIN 改为应用层组装、分页改用游标方案(避免 LIMIT M,N 性能坍塌)
PHP 层配合优化不能只靠数据库
ORM 不等于万能,复杂查询建议直写 PDO 预处理语句;批量操作禁用循环 INSERT,改用 INSERT ... VALUES (...), (...), (...);启用 PDO::ATTR_EMULATE_PREPARES = false 确保真正预编译;连接池暂不可用时,至少复用 PDO 实例并设置 PDO::ATTR_PERSISTENT = true(注意 Apache prefork 模式下慎用);缓存策略上,高频只读数据用 Redis 做二级缓存,但需设计好失效逻辑(如更新 DB 后主动 del key,而非依赖 TTL)。











