MySQL"瘦身"之:分区分表存储原理解密,性能飞起

113 阅读3分钟

MySQL"瘦身"之:分区分表存储原理解密,性能飞起

回答

  1. 在Innodb中(8.0之前),表存储主要依赖两个文件,分别是.frm文件和.ibd文件。

    • .frm文件用于存储表结构定义信息,
    • .ibd文件用于存储表数据。
  2. 做分区后,表面是还是只有一张表,只不过数据保存在不同的位置上了(同一个.frm文件)。在做数据操作的表名还是users表,数据库会自己去组织各个分区的数据。

  3. 做分表后,不管是表面上,还是实际上,都已经是不同的表了(多个.frm文件)。数据库操作的时候,需要去指定具体的表名。

  4. 一般来说,数据量变大时,我们应该先考虑分区,分区搞不定再考虑分表。

    因为,分表可以在分区的基础上,进一步减少查询时的系统开销。

    因为,分表后,单表数据量小,页缓存率更高,I/O读写性能更优。

    另外,分表也能降低了锁带来的阻塞,也可以提高事务处理效率。

    还有,小表可以提升备份和恢复的速度、并且具有更好的横向扩展性。

1、实际使用场景对比
  1. 分区表

    • 中等数据量(千万级):分区表在需要按时间、地域等规则快速裁剪数据的场景中应用广泛,例如:

      日志系统:按月分区,快速归档历史日志。 订单表:按用户ID范围分区,隔离活跃与非活跃订单。

    • 优势:无需拆分业务逻辑,MySQL自动管理分区,适合单库内优化。

  2. 分表

    • 超大数据量(亿级以上):分表在高并发、分布式架构中更常见,例如:

      用户表:按用户ID哈希分表,分散到多个数据库实例。 电商订单:按地区或业务类型分库分表,支持水平扩展。

    • 优势:突破单机存储和性能瓶颈,适合跨节点部署。

2、核心指标对比

image-20250403110952995

3、如何选型?
  1. 数据量是否超过1亿行?
    • 是 → 分表(优先考虑分库分表)。
    • 否 → 进入下一步。
  2. 查询是否集中于特定范围(如时间)?
    • 是 → 分区表。
    • 否 → 分表。
  3. 是否需要分布式部署?
    • 是 → 分表(结合中间件)。
    • 否 → 分区表。
4、注意事项
  1. 分区表
    • 分区键选择:需与查询条件强关联,否则分区裁剪失效。
    • 分区数量限制:MySQL单表最多1024个分区,需提前规划。
  2. 分表
    • 跨表事务:需通过分布式事务或最终一致性方案解决。
    • 分片键设计:避免数据倾斜(如用户ID哈希分片)。
5、总结建议
  1. 推荐分区表:数据量中等(千万级)、查询集中、维护成本敏感的场景。
  2. 推荐分表:数据量超大(亿级+)、高并发、需分布式扩展的场景。
  3. 终极方案:结合业务增长预期,初期用分区过渡,后期逐步迁移至分表架构。