zoukankan      html  css  js  c++  java
  • 数据库分库分表

    什么是分库分表:

    分表:将某一张表的数据 拆分成若干份,分别放到结构相同的不同表中,然后,可以再同一个库里,也可以放到不同的库。

    分表又叫水平分区,这种方式实现起来就比垂直分区复杂些,但是它能解决垂直分区所不能解决的问题,即单张表的访问及写入很频繁,这时候就可以根据一定的业务规则(PS:如互联网BBS论坛的会员等级概念:根据会员等级来分表)来分表,这样就能减轻单表压力,并且还能解决各个模块的之间的频繁交互问题。  

    分库:将原有的一个数据库拆分成多个数据库,每个数据库的结构相同。

    分库又叫垂直分区,这种方式实现起来比较简单,重要的是对业务要细化,分库时候要想清楚各个模块业务之间的交互情况,避免将来写程序时出现过多的跨库操作。 

    为什么要分库分表:

    随着企业的发展,库中的表会越来越多,同时每张表的数据也会越来越大。这样做相同的操作:表连接,增删改查所耗费的性能也越来越大。与此同时,数据库访问者越来越多时,一台服务器的的负载也会越来越大,因为cpu 内存 io 都是一定的,这样最终的结果就是系统会越来越卡,直至各种超时。

    而当我们采用分布式系统,负载均衡的分散数据,就可以很好的解决这个问题。

    文中引用的地址是:http://my.oschina.net/cmcm/blog/175104  虽然作者是搞mysql的但是基本设计思想是一致的。内容我做了部分批注

    分表
    当然,首先要知道什么情况下,才需要分表。个人觉得单表记录条数达到百万到千万级别时就要使用分表了。 
    1,分表的分类 
    1>纵向分表 
    将本来可以在同一个表的内容,人为划分为多个表。(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的。) 
    分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的) 
    案例: 
    对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。 (冷数据和活跃数据单独分表)
    这样纵向分表之后: 
    首先存储引擎的使用不同,冷数据使用MyIsam (mysql中的技术)可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。 
    其次,对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。 
    其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库。或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个。 
    2>横向分表 
    字面意思,就可以看出来,是把大的表结构,横向切割为同样结构的不同表,如,用户信息表,user_1,user_2 等。表结构是完全一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分。 
    分表理由:根据数据量的规模来划分,保证单表的容量不会太大,从而来保证单表的查询等处理能力。 (并且如果可以很好的定位到数据在哪张分表时,使用表连接查询的话 效率和速度都会更好)
    案例:同上面的例子,博客系统。当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能。例如博客的冷数据表,假如分为100个表,当同时有100万个用户在浏览时,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(因为,不可能绝对的平均,只是假设),这样压力就降低了很多很多。 

    数据库的复制能解决访问问题(简单的负载均衡,不考虑数据分摊,数据都是一致的),并不能解决大规模的并发写入问题,要解决这个问题就要考虑mysql数据切分了 

    数据切分,顾名思义,就是数据分散,将一台主机上的数据分摊到多台,减轻单台主机的负载压力,有两种切分方式,一种是分库,即按照业务模块分多个库,每个库中的表不一样(按照模块划分表然后区分到不同的库),还有一种就是分表,按照一定的业务规则或者逻辑将数据拆分到不同的主机上,每个主机上的表是一样的,这个有点类似于Oracle的表分区(按照业务逻辑将数据拆分,然后保存到不同的数据库中,比如前边讲到的活跃数据)。 
    分库的优点是:实现简单,库与库之间界限分明,便于维护,缺点是不利于频繁跨库操作,单表数据量大的问题解决不了。 
    分表的优点是:能解决分库的不足点,但是缺点却恰恰是分库的优点,分表实现起来比较复杂,特别是分表规则的划分,程序的编写,以及后期的数据库拆分移植维护。 
    实际应用中,一般互联网企业的路线都是先分库再分表,两者结合使用,取长补短,这样发挥了mysql扩展的最大优势,但是缺点是架构很大,很复杂,应用程序的编写也比较复杂。 
    以上是mysql的数据切分的一些概念,数据切完了,现在要做的是怎么样在整合起来以便于外界访问,因为程序访问的入口永远只有一个,现在比较常用的解决方案是通过中间代理层(类似于负载均衡的控制器)来统一管控所有数据源。 


  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/jilodream/p/4219806.html
Copyright © 2011-2022 走看看