MySQL的分⽚
前⾔
从开发⼈员的⾓度来说,为什么要了解和掌握MySQL分⽚?
第⼀,了解MySQL分⽚可以更合理地定制分⽚策略,选分⽚字段是要讲科学的。
第⼆,了解MySQL分⽚以后如果出现故障报错,也有助于问题的排查。
第三,关系到开发过程中的代码调整,做分⽚后的MySQL数据库操作受到限制,⽐如join之类的操作,跨分⽚的操作,事务管理等,都是要注意的,可能需要代码的调整。
分区、分表、分⽚、分库的概念
那么⾸先,我们要理解⼀下分区、分表、分⽚、分库的概念。
分区,局限于单⼀数据库节点,将⼀张表分散存储在不同的物理块中。MySQL5以后⽀持分区,但是不⽀持⼆级分区,并且单机MySQL的性能远远不如Oracle,所以分区并不能解决性能问题。
分表,分表有两种,应⽤层⾯的分表和代理层⾯的分表。
应⽤层⾯的分表,⼈⼯把⼀张逻辑上完整的表分成若⼲个⼩表。⽐如T_PAYMENT表分为T_PAYMENT_0101…T_PAYMENT_1231。对代码不透明。
代理层⾯的分表,通过MERGE引擎或者代理中间件把表分成若⼲的字表,对应⽤只保留⼀个“表壳”,对代码透明。(MERGE引擎⽰意)
分表和分区⽐较类似,侧重点不同,分区侧重提⾼读写性能,分表侧重提⾼并发性能。两者不冲突,可以配合使⽤。
分库,单纯的分库就是垂直切分,把不同业务逻辑的表分开存储在在不同的数据库。
分⽚,分⽚就是分库+分表,属于⽔平切分,将表中数据按照某种规则放到多个库中,既分表⼜分库,就相当于原先⼀个库中的⼀个表,现在放到了好多个表⾥⾯,然后这好多个表⼜分散到了好多个库中。
分⽚和分区也不冲突。
MySQL分⽚
分⽚键
数据分⽚是将⼀张分布式表按照指定的分⽚键(Partition Key)和分⽚模式(Partition Mode)⽔平拆分成多个数据⽚,分散在多个数据存储节点中。对于分⽚的表,要选取⼀个分⽚键。⼀张分布式表只能有⼀个分⽚键,分⽚键是⽤于划分和定位表的列,不能修改。
分⽚模式
·枚举/列表List
{1 => Cluster A, 2 => Cluster B}
·范围Range (仅⽀持数字或ASCII字符串类型的分⽚键)
{[1 - 100] => Cluster A, [101 - 199] => Cluster B}
·散列Hash (仅⽀持数字或ASCII字符串类型的分⽚键)
{1024n + 1 => Cluster A, 1024n + 2 => Cluster B}
分⽚⽅式类似于分区⽅式,可以选择枚举,范围Range或者散列哈希。不同的是分⽚不⽀持时间range。
分⽚策略
在做分⽚的时候,选择合适的分⽚规则⾮常重要,将极⼤地避免后续数据的处理难度,有以下⼏点需要关注:
1. 能不分就不分,对于1000万以内的表,不建议分⽚,通过合适的索引,读写分离等⽅式,可以更好地解决性能问题。
2. 分⽚数量不是越多越好,并且尽量均匀分布在多个存储节点上,只在必要的时候进⾏扩容,增加分⽚数量。
3. 分⽚键不能为空,不能修改,所以要选择表中中最常⽤且不变的字段。
4. 分⽚键选择时尽量做到可以将事务控制在分⽚范围内,可以避免出现跨分⽚的操作。
5. 选择分⽚规则时,要充分考虑数据的增长模式,数据的访问模式,分⽚关联 性问题,以及分⽚扩容问题。
总体上来说,分⽚的选择是取决于最频繁的查询 SQL 的条件。出每个表最频繁的 SQL,分析其查询条件,以及相互的关系,并结合 ER 图,就能⽐较准确的选择每个表的分⽚策略。
MySQL分⽚要解决的问题
事务问题
分布式数据库分散在多个不同的物理主机,⽹络环境复杂,关注事务,保证数据⼀致性是⼀个问题。先看单机环境下的事务管理,以Spring为例,利⽤注解的事务管理:
@Override
@Transactional
public void service(){
...
UserService.updateUserByUserId(userId);
...
OrderService.updateOrderByOrderNo(orderNo);
...
}
实际上这段代码相当于:
@Override
public void service(){
...
UserService.updateUserByUserId(userId);
...
OrderService.updateOrderByOrderNo(orderNo);
...
try{
commit();
}catch(Exception e){mysql下载后的初次使用
rollback();
}
}
如何给多主机发commit并且保证他们最终状态⼀致就是分布式事务要解决的问题。
解决这个问题有两种⽅案。
第⼀种由应⽤程序和数据库共同控制,将⼀个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上⾯的⼩事务,并通过应⽤程序来总控各个⼩事务。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。