要求
mysql数据库在什么情况下需要进行分库分表分区
基础概念
- 分表 能够解决单表数据量过大带来的查询效率下降的问题
- 分库 面对高并发的读写访问,master无法应对写操作的压力时,需要分库来提高数据库的并发访问能力
分库分表场景
- 单表数据达到千万
- 数据库面临高并发访问
实现策略
对关键字取模,实现对数据访问路由
分库
- 按照功能分
- 比如用户,订单等
- 按照地区分
- 北京,上海
- 带来的问题
- 跨库join问题
- 全局表
- 数据冗余
- 应用层组装
- 跨库join问题
分表
水平分表
- 解决的问题
- 单表过大的问题
- 方法 一般都是按照某个字段hash取模
- 按照某个字段分
- 比如status状态1 2 3,分到三个不同的表中
- 按照日期分表
- 按照某个字段分
垂直分表
- 解决的问题
- 实现冷热数据分离
- 减少数据行大小,避免跨页问题,提高查询性能
- 方法
- 把不常用的字段单独放在一张表
- 打字单单独拆分出来放在附件表中
- 经常组合查询的在一张表
分区
水平分区
mysql仅仅支持水平分区
当业务规模越来越大时,mysql成为瓶颈
- 最基本的首先在sql层面上进行优化
- 增加缓存
- 主从复制,实现读写分离
- 使用mysql的分区表,较少的代码改动,仅仅增加一些查询条件
- 先做垂直切分,降低模块之间的耦合度,将大系统分为多个小系统
- 再做水平切分,选取合适的sharding key,同时表结构要改的,冗余字段,改sql,改应用