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

来源:互联网 发布:库里数据统计职业生涯 编辑:程序博客网 时间:2024/06/11 20:22

1. 把一个实例中的多个数据库拆分到不同的实例。

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

2. 把一个库中的表分离到不同的数据库中。

3. 对一个库中的相关表进行水平拆分到不同实例的数据库中。(可以使用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,所以建议使用)。

原创粉丝点击