mysql 分库分表之分片键概念
昨天遇见小学同班同学,没想到他混的这么差,只往我碗里放了一块钱。
在进行分库分表的时候,有个分片键概念
:分片键是用于决定数据会被分布在哪个分片中的字段
分片算法:分片键决定了数据会被分布在哪个分片,原理就是根据分片键的值计算出数据所分布的分片 ID.
计算的过程就是分片键算法,即 f(shardKey) = shardID,常见的算法有三种
1、Range
范围分片算法,按照字段的取值范围来计算数据所属分片
优点:
1)实现简单
2)分片键范围查询效率高
3) 支持动态分片(即到达一个范围自动创建一个分片),扩容简单
缺点:
1)数据热点问题,某个范围的数据可能很大或很小
2)不具备写分散性
2、Hash
Hash 算法的定义很简单:输入任意关键字,得到一个固定长度输出
优点:
1)数据分散均匀
缺点:
1)分片扩容复杂,因为需要重新分布数据
2)不适合范围查询
3、Lookup
也称之为目录映射或查找映射,其实就是直接定义分片和分片键值之间的映射关系,将其维护在配置或数据库中,是一种静态分片
优点:
1)实现简单,直接定义映射关系即可
缺点:
1)配置错误时会出现异常
分片键的选择
1)使用高频字段
2)基数大
3)稳定
4)可以尽量保证数据分布均匀
5)可以尽量保证事物在同一个分片
基因分片:一个字段包含了两种分片信息
原理:X % 2^n = X 的二进制的最后 n 位
完成某些需求:
如果 SQL 中有订单号,可以直接定位到单个订单数据所在分片;
如果 SQL 中只有用户 ID ,可以取用户 ID 的一部分来定位到这个用户所有订单数据所在分片;
注:淘宝的订单列表就会发现订单的后几位都是一致的