数据库的分区分库分表,水平切分与垂直切分

在整理项目的时候,突然发现对数据库的水平切分与垂直切分比较模糊,特此学习!

参考:https://www.cnblogs.com/bluebluesky/articles/6413831.html
1、数据库分区

  就是把同一个数据库里的表放到不同的服务器上,负载均衡,但是在用户上来看,只有一个服务器

2、数据库分表

    把一张表按照一定的规则分解成不同的实体表。比如垂直划分和水平划分

  2.1、垂直切分

    把不同功能,不同模块的数据分别放到不同的表中,但是如果同一个模块的数据量太大就会存在性能瓶颈

   2.2、水平切分

  垂直切分解决不了大表的瓶颈,如果同一个功能中表的数据量过大,就要对该表进行切分,为水平切分

通俗理解:垂直切分---分不同的模块表;水平切分---分同一个模块下的多个表

   2.3、二者的结合

  垂直切分可以使模块的划分更清晰,分成功能不同的表;水平切分可以解决大数据下大表性能的瓶颈问题。

   2.4、案例

以mysql为例,简单购物系统暂设涉及如下表:

  1.产品表(数据量10w,稳定)
  2.订单表(数据量200w,且有增长趋势)
  3.用户表 (数据量100w,且有增长趋势)
  以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万
  垂直拆分:
  解决问题:
  表与表之间的io竞争
  不解决问题:
  单表中数据量增长出现的压力
  方案:
  把产品表和用户表放到一个server上
  订单表单独放到一个server上
  水平拆分:
  解决问题:
  单表中数据量增长出现的压力
  不解决问题:
  表与表之间的io争夺
  方案:
  用户表通过性别拆分为男用户表和女用户表
  订单表通过已完成和完成中拆分为已完成订单和未完成订单
  产品表 未完成订单放一个server上
  已完成订单表盒男用户表放一个server上
  女用户表放一个server上(女的爱购物)
3、分库

    将一堆数据放到不同的数据库中保存,上面说的都是在同一个数据库上,分库是分到不同的数据库上

4、分区和分表的区别与联系

   1)分区和分表的目的都是减少数据库的负担,提高表的增删改查效率

   2)分区知识一张表中的数据的存储位置发生变化,还是在一张表中,分表是将一张表分成多张表

  3)当访问量大,且表数据比较火时,两种方式可以相互配合使用

  4)当访问量不大,但表数据比较多时,可以只进行分区

5、分库分表存在的问题:

  1)事务问题

   在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出昂贵的性能代价,如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

 2)跨库跨表的join问题

  在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表,不同的库上,这是,标的关联操作将会受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果一次查询能够完成的业务,可能需要多次查询才能完成

  3)额外的数据管理负担和数据运算压力

   额外的数据管理负担,就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然会引起额外的逻辑运算,例如,对于一个记录用户乘积的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需要一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果
 

发布了19 篇原创文章 · 获赞 149 · 访问量 80万+

猜你喜欢

转载自blog.csdn.net/truelove12358/article/details/103179462
今日推荐