数据库的分库分表的一些总结

发布于 2019-12-25 16:40:25
  1. 把一个实例中的多个数据库拆分到不同的实例。

1.1 比如把订单,用户和促销的节点一分为订单节点一,用户节点二,促销节点三。

  1. 把一个库中的表分离到不同的数据库中。
  2. 对一个库中的相关表进行水平拆分到不同实例的数据库中。(可以使用oneProxyp中间件来控制)

3.1 选择分区键值
(1)分区键要能尽量避免跨分片查询的发生;
(2)分区键要能尽量使各个分片中的数据平均。

3.2 存储无需分片的表的方式
(1)每个分片中存储一份相同的数据
优点:可以联表查询,并且对业务逻辑也不会太大改变;
缺点:造成了数据冗余。
(2)使用额外的节点统一存储
优点:不会造成数据冗余;
缺点:是不能连表查询,得通过程序来合并查询的数据,所以查询效率较(1)差一些。

3.3 在节点上部署分片,有三种常用方式
(1)每个分片使用单一数据库,并且数据库名也相同;
(2)将多个分片表存储在一个数据库中,并在表名上加入分片号后缀;
(3)在一个节点中部署多个数据库,然后将数据库名进行编号,每个数据库包含一个分片;

3.4 分配分片中的数据的方式
(1)按分区键的Hash值取模来分配分片数据
优点:能相对平均分配数据到每个分片中;
缺点:很难决定什么样的数据分配到哪个分片中。
(2)按分区键的范围来分配分片数据
优点:能清楚知道分区键在哪个分片中;
缺点:可能造成数据分配和访问量不平均。
(3)利用分区键和分片的映射表来分配分片数据。
优点:能平均分配数据到每个分片中;
缺点:该表读压力会很大,很可能会造成影响性能的瓶颈,所以建议开启缓存。

3.5 分片生成全局唯一ID的方式
(1)使用auto_increment_increment(自增步长)和auto_increment_offset(自增开始数)(参数适用于一个节点中只保存一个数据表,如果一个节点中有多个数据表就不能使用该方式);
(2)使用全局节点来生成ID(可能造成系统的性能瓶颈);
(3)在Redis等缓存服务器中创建全局ID(因为redis读写效率远大于mysql,所以建议使用)。
————————————————
版权声明:本文为CSDN博主「Lin程序」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/min903245074/article/details/78080541

0 条评论

发布
问题

官网
微信

官方微信