MySQL 表设计与架构优化:分表、读写分离与参数

一、表与字段设计

原则 做法
选最小够用类型 状态用 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/索引优化 > 表结构与缓存 > 参数与连接池 > 读写分离 > 分库分表。从成本最低、收益最高处动手,别一上来就分表。