一、表与字段设计
| 原则 | 做法 |
|---|---|
| 选最小够用类型 | 状态用 TINYINT 而非 VARCHAR;金额用 DECIMAL 不用 FLOAT |
| 时间类型 | 用 DATETIME/TIMESTAMP,别用字符串存时间 |
| 避免大字段 | text/blob 单独表或多放对象存储 |
| 主键 | 用自增或有序 UUID,避免无序导致页分裂 |
范式 vs 反范式:高范式减少冗余但多 JOIN;报表/读多场景适度反范式(冗余字段、汇总表)提查询速度。按读写比例权衡。
二、分库分表
- 垂直拆分:把大表按列拆到不同表/库,降低单行宽度;
- 水平拆分:按分片键(如 user_id 取模、按时间)把数据散到多表/多库;
- 分片键选择:选高频过滤、分布均匀的列,避免跨片查询。
分表是”最后手段”——先确认索引、SQL、缓存、单机参数都已优化仍扛不住再拆。
三、读写分离与主从
- 写主库、读从库,扛住读多写少;
- 主从延迟:刚写立即读可能读不到,关键路径走主库或加读主库标识;
- 用中间件(MyCat / ShardingSphere / ProxySQL)做路由与负载。
四、连接池与参数
max_connections # 最大连接数,别设过大压垮内存
wait_timeout # 空闲连接回收,防连接堆积
innodb_buffer_pool_size# 缓存数据和索引,通常设物理内存 60%-70%
应用侧连接池(HikariCP 等)要设合理最大连接与超时,避免雪崩时连接耗尽。
五、运维与监控
- 慢查询日志常态化开启并定期分析;
- 监控 QPS、连接数、缓冲命中率、锁等待;
- 定期
ANALYZE TABLE更新统计信息,让优化器选对计划; - 大表 DDL 用在线工具(pt-osc / gh-ost),避免锁表。
六、优化顺序总结
SQL/索引优化 > 表结构与缓存 > 参数与连接池 > 读写分离 > 分库分表。从成本最低、收益最高处动手,别一上来就分表。