选择合适的分区类型
MySQL 支持 RANGE、LIST、HASH、KEY 等分区方式,应根据数据特点和查询模式选择:
RANGE 分区:适用于按时间或数值范围查询的场景,如按月分表的日志数据。确保分区边界覆盖实际数据分布,避免数据倾斜。 LIST 分区:适合离散值分类,如按地区或状态划分。注意值分布均衡,防止某些分区过大。 HASH/KEY 分区:用于均匀打散数据,提升写入吞吐。适合无明显范围查询条件的主键分散。以查询条件为基础设计分区键
分区字段应与高频查询的 WHERE 条件匹配,才能触发分区裁剪(Partition Pruning),减少扫描量。
例如,按created_at做 RANGE 分区时,查询带时间范围才能有效过滤分区。 避免使用非分区键作为主要查询条件,否则可能导致全分区扫描。 复合查询中,分区键尽量放在索引前列,配合局部索引提升效率。
控制单个分区数据量
分区不是越小越好,但单个分区过大也会影响性能。
建议单个分区数据量在几百万行以内,具体视硬件和查询响应要求而定。 定期评估数据增长趋势,动态调整分区策略,如从按月分区转为按周或添加新分区。 使用EXPLAIN PARTITIONS检查查询是否命中正确分区。
定期维护与监控
分区表需持续维护以保持高效运行。
对过期分区使用ALTER TABLE ... DROP PARTITION或更安全的
TRUNCATE PARTITION。 大表删除数据优先考虑直接删分区,比 DELETE 快得多。 重建或优化特定分区可用
REPAIR PARTITION或
OPTIMIZE PARTITION,但会锁表,建议低峰期操作。 监控各分区大小、查询执行计划和 I/O 分布,及时发现热点分区。 基本上就这些。关键是在业务需求和数据特征之间找到平衡,避免过度设计,同时保证可扩展性。
