1. 介绍

这个信息时代,每天都有大量数据产生。这对我们的技术也提出了新的挑战。今天简单看了点东西做了点总结。

2. 发展史

单纯从时间线来看,数据存储经历了 RDBMS->NoSQL->NewSQL

下面我们就以这三个类别来讨论。

PS: 我将不支持ACID特性的的都归纳到NoSQL哦,比如说ES。

3. RDBMS

RDBMS已经存在几十年了,非常成熟稳定。所以无论选择啥存储方案,一般都仍然会使用RDBMS做主存储。而且绝大部分场景,可以通过以下方式来提升RDBMS的查询效率:

  1. 建索引:合理的建和使用索引,查询亿级别的数据,控制在1秒内不成问题
  2. 分库分表:可以用一些JDBC sharding来做分库分表

4. NoSQL

4.1 Redis

如果不介意Redis的缺点的话(换句话说就是符合其使用场景的话),使用Redis可以显著提高读取性能。其优点就是社区十分成熟了,坑相对较少。

Redis的问题主要是:

  1. 数据类型支持少
  2. 不支持条件查询和复杂查询SQL。查询发杂情况下CPU load会很高

3.占用内存

  1. 没索引

4.2 SSDB

性能上可以做到和redis差不多。相比redis有些其自身优点:

  1. 支持冷热数据
  2. 更加节约内存

不过成熟度比redis差不少。

4.3 elasticsearch

社区成熟度还可以。同样能够提供高效的查询。相比redis而言能提供各种复杂的查询。不过重要数据不建议存储。因为其在安全方面比较差。容错方面比mongoDB好些。比如1主多从,主片挂了从片会自动顶上。对读多写少的存储es是可以代替mongo的,特别是运行在SSD服务器上时。ES维护起来还算简单。性能上若于mongoDB。

这个ES我也没好好用过,主要来源于网上资料参考。看看别人的应用场景吧,或许有所收获:
例1:

例2(罗哲):

关于该问题,在知乎已经有讨论,感兴趣的可以自己去看一看:
elasticsearch(lucene)可以代替NoSQL(mongodb)吗?

4.4 mongoDB

什么时候用mongoDB? 给出一篇文章作为参考:什么场景应该用 MongoDB?

比较适合的场景可以参考下图:以下特性有2个YES,选择mongoDB不会后悔。

4.5 mongoDB vs elasticsearch vs redis

真正的坑,估计只有全部好好玩过的才清楚了。

不过这篇文章罗列的表格可以参考:System Properties Comparison Elasticsearch vs. MongoDB vs. Redis

5. NewSQL

国外的google,国内的阿里,都在往NewSQL上发力,准备弄符合ACID特性的分布式数据库。拥有NOSQL的分布式高性能、扩展能力还具备ACID特性。从这个初衷来看,是很好的。

说到NewSQL必然要说到Google的F1。参照F1的理念,国内的pingCAP做出了类似的开源产品TiDB

有人可能会说,不是有mycat这样的RDBMS分布式方案了嘛,为啥还需要什么分布式数据库?关于这个问题可以参考下文章:怎样打造一个分布式数据库。简单来说,主要原因是通常的sharding,并没有真的做到分布式。比如SQL执行计划仍然是单机的,也没法做跨节点的join。没有完全发挥分布式计算的真正优点。

这里就简单提下NewSQL。后面有机会好好聊聊F1的原理,还有TiDB的实现。