nosql,数据量变大时的自然选择

sql解决数据量过大问题的方法

通常情况下,我们用sql数据库存储我们的数据。在项目刚开始的时候,用户量比较小,相应的数据量也比较小,并发压力也比较小。当我们的web应用越来越受欢迎后,用户量会激增,访问量会激增,数据量也会变大 。于是会经历这样的几个变化。

1.主备分离

用户量激增的时候,常常最先开始发生的问题是,读写性能不够。于是为了解决这个问题,创建几个备库。所有的写操作都在主库上执行,然后同步到备库上,所有的读操作都在备库。

这样重构后读写性能会比较好。

2.分库

但随着用户量进一步增加,这个时候同一个应用的所有的表的数据已经无法同时容纳在一台机器上了。这个时候又需要重构。

解决办法是将某些数据量特别大的表抽出来,单独存放在一台机器上。这在一定程序上可以缓解数据量过大的问题。

3.分表

当数据量进一步增加的时候,会发现就算一个机器只存储一张也存储不下了。

这时候的做法是将一张表的内容切分成多个表分别存储到不同的机器。

经过上面三个步骤数据过大的问题基本解决了。

but,关键的but

分库分表后,我们失去了什么

先看看sql数据库的一些关键特性

a事务:包括A(原子性),C(一致性),I(隔离性),D(持久性)

b多表联合:join,select from多个表的时候都是这种情况

c索引:根据某个条件来查询

e聚合操作:count(),sum(), group by , having

1.主备分离时

此时失去了事务的隔离性。

如果在一个事务中即有读也有写,那么读操作是在备库上执行,而写操作是在主库上执行,而sql的事务管理器无法管理不同机器上的操作。主机器的值发改变时,备库是无法瞬间感知到的,同步需要时间,虽然这个时间很短,可能只有1/1000秒,但就算是这1/1000的差别也会导致事务失效。

2.分库时

  • 此时失去了事务。事务中只要涉及到多张分布在不同机器上的表的操作,那么整个事务就不会生效。sql数据库本身无法管理跨机器的事务。当然也有跨机器的事务方案,但一般来说,效率都非常低下,因此分布式事务这种方案几乎可以忽略。
  • 多表联合完全失效。当表处于不同的机器上时,表之间的联合查询那将是完全不可能。

3.分表时

此时sql的关键特性几乎都不能用。

事务,多表联合,索引,聚合几乎都不可用。

索引不可用。比如一个博客表,一般会按用户来分表,将同一个用户的所有的数据都放在同一台机器,但这时如果我们创建时间来查询,想查询所有的用户在今天发表的日志,那么此时就会失效。这时需要到每一个分表上进行查询然后将查询结果进行拼装。而原生的sql是完成不了的。

当索引不可用时,聚合操作当然也是不准的。

sql  or nosql

因此可以看到当数据量变大时sql几乎就失效了。几乎所有关键特性都不可用了。能用就差不多(当然还有些许其它的)只有通过主键或分区列(决定数据在哪台机器的列,例如时间,用户ID)进行操作,通过其它维度的操作将非常困难。

来看看nosql数据库,比如hbase  cassandra mongodb,好像差不多也是只能通过主键进行操作。

因此可以说,当关系型数据库进行了分库分表后,系统就变成了nosql,因为关系统型数据库的大部分的重要特性已经完全不可用了,可用的部分nosql也几乎都有。

虽然分库分表解决了大数据量的问题,但nosql确走得更远了,提供更多令人激动的特性。

1.自动化扩容。对于关系型数据库来说,分库分表的扩容是一个非常非常非常困难的事情,每一次扩容必须要提前做好规划,必须认真评估,搞不好还需要数据迁移,对于一个正在运行着的系统来说这是非常巨大的挑战。而nosql数据,已经将这些功能内置,自动化。

2.同步副本。hbase cassandra都实现了同步副本功能,每个表都可以根设定值来同步到其它机器上,当一台机器宕机,操作直接转移到另外的机器,这种转移是瞬间完成。当然mysql  oracle也有主备切换的功能,但主备的切换需要时间。因此nosql对断网宕机有更好的容错性。

当然现在已经有很多的公司转向了nosql,但采用关系型数据库分库分表的依然非常多。但在大数据量下,从sql转向nosql已经成了一个势不可挡的趋势。

时间: 2024-10-11 08:23:26

nosql,数据量变大时的自然选择的相关文章

Base64编码为什么会使数据量变大?

当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据量明显变大,为何呢?这里就得先探究一下什么是Base64编码. Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组

oracle 数据量大时如何快速查找需要数据

查询eai_salesorder表中是否有今天(20180712)的数据. 方法一 select * from eai_salesorder where eaicreatedate like '2018-07-12%'; 用时 20.176秒 方法二 select * from (select * from eai_salesorder order by eaicreatedate desc) where rownum<'100' order by rownum desc;  用时32.628秒

PHP 导出excel 数据量大时

public function ceshiexcel1(){ set_time_limit(0); $filename = '病毒日志'; header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$filename.'.csv"'); header('Cache-Control: max-age=0'); //原生链接mysql //数据库

DataTable 数据量大时,导致内存溢出的解决方案

/// <summary> /// 分解数据表 /// </summary> /// <param name="originalTab">需要分解的表</param> /// <param name="rowsNum">每个表包含的数据量</param> /// <returns></returns> public DataSet SplitDataTable(DataT

关于element中el-select数据量大时如何进行分页

在使用element中的el-select中因为有时候数据可能会比较多,所以我就想分步加载显示,就像: 因此我在组件中这么写的: 下面是样式 <style lang='stylus' scoped> .selectJob span width 120px overflow hidden text-overflow ellipsis white-space nowrap .text padding-left 10px font-size 14px font-weight bold cursor

解决持久化数据太大,单个节点的硬盘无法存储的问题;解决运算量太大,单个节点的内存、CPU无法处理的问题

需要学习的技术很多,要自学新知识也不是一件容易的事,选择一个自己比较感兴趣的会是一个比较好的开端,于是,打算学一学分布式系统. 带着问题,有目的的学习,先了解整体架构,在深入感兴趣的细节,这是我的计划. 首先得有问题,如果每日重复相同的工作,也不主动去学习,很难发现新的问题.不怕自己无知,就怕不知道自己无知,只有不断的学习,才会发现更多未知的知识领域! 带着问题出发 回到顶部 分布式要解决什么问题呢?解决持久化数据太大,单个节点的硬盘无法存储的问题:解决运算量太大,单个节点的内存.CPU无法处理

hadoop job解决大数据量关联时数据倾斜的一种办法

转自:http://www.cnblogs.com/xuxm2007/archive/2011/09/01/2161929.html http://www.geminikwok.com/2011/04/02/hadoop-job解å?³å¤§æ?°æ?®é??å?³è??æ—¶æ?°æ?®å?¾æ??ç??ä¸?ç§?å??æ³?/ 数据倾斜是指,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为

大数据量传输时配置WCF的注意事项

原文:大数据量传输时配置WCF的注意事项 WCF传输数据量的能力受到许多因素的制约,如果程序中出现因需要传输的数据量较大而导致调用WCF服务失败的问题,应注意以下配置: 1.MaxReceivedMessageSize:获取或设置配置了此绑定的通道上可以接收的消息的最大大小. basicHttpBinding等预定义的绑定一般具有MaxReceivedMessageSize属性,CustomBinding则需要在Transport中定义. 示例代码: <bindings> <custom

MongoDB数据量较大时如何构建索引--减少业务最少影响

在数据量较大或请求量较大,直接建立索引对性能有显著影响时,可以利用复制集(数据量较大时一般为线上环境,使用复制集为必然选择或者使用分片.)中部分机器宕机不影响复制集工作的特性,继而建立索引. 备注:添加索引的表使用WT引擎,数据量有1.5亿左右. 1. 副本集配置参数 节点1: $ more shard1.conf dbpath=/data/users/mgousr01/mongodb/dbdata/shard1_1 logpath=/data/users/mgousr01/mongodb/lo