您的位置:首页 > 数据库

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

2017-09-24 22:27 176 查看

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,所以建议使用)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库