zoukankan      html  css  js  c++  java
  • NoSql基础知识

    一、为什么要有NoSql

    关系型数据库在三个方面存在不足,或者说,比不上NoSQL:

    1、大量数据的写入处理

    这里说的关系型数据库不擅长大量数据写入,并不是说关系型数据库在进行大批量数据插入的时候,比不上NoSql快,而是说,关系型数据库不擅长将这么多的数据写入到分布式服务器里面去!因为大量的数据,往往意味着不可能只存在一台服务器上,应该是分布式的,分散地存储在多台服务器上。而关系型数据库,因为着重表与表之间的关联,需要将所有表放在同一台服务器中,所以有人(淘宝的数据库专家)说,目前的关系型数据库本质上是单机系统。而NoSql因为表之间并无关联,因此是天然适应分布式的,分布式写入,当然要比关系型数据库强。

    好比关系型数据库,为了应付大量的数据存储,由一台服务器分为两台服务器,那么就有两种方案:

    1)二元数据库

    两台服务器的表都一样,写入的时候,可以将数据分成两份,每台写一半,然后再互相更新,同步。那么同步之前,有一致性问题。

    2)数据库分割

    将一部分表放在服务器A,另一部分表放在服务器B。同步问题是没有了,但如果这些表要关联查找呢?大概只能在应用程序层面进行了。

    看上去,这两种方案都很折腾。

    2、对存在大量数据的表做索引或进行表结构变更

    关系型数据库的表结构很严谨,对有数据的表做表结构变更,或者索引,那么会有一个锁定的问题,数据越多,锁定问题越严重。如果是一个使用中的生产数据库,也许是不可以接受的。

    而NoSql,因为其设计和结构不同于关系型数据库,比如mongoDB,文档型,每一条记录都是一个文档,文档里存什么都可以,不存在着所谓固定的文档格式,也就不存在什么表结构变更的问题(MongoDB没有所谓表结构)。关系型数据库,表结构变更,程序和数据库都要改;对MongoDB,改程序就可以了。

    至于索引,我还尚不清楚NoSql的索引原理。但如果是键值对型NoSql,则索引都是KEY,没有必要进行变更?

    3、没有join的简单查询快速返回结果

    查询是关系型数据库的强项,但如果不涉及到join的话,其实NoSql会比它更快?

    参考资料:

    http://kb.cnblogs.com/page/95676/

    二、NoSql的分类

    根据数据库的存储种类和特点,可以分为:

    1、键值对

    代表:memcached,Redis

    2、文档型

    以mongoDB为代表。比对关系型数据库,集合可看成表,文档可看成记录。每一条记录,都是一个文档。

    3、列存储

    HBase

    4、图存储,对象存储,XML等等

    三、如何应用NoSql

    NoSql天然分布式,特别有利于数据分散存储,易扩展,高可用,高性能,但不支持事务,如果能与关系型数据库搭配使用,可形成互补。

    NoSql的使用方式,大致可分为:

    1、以NoSql纯用作内存管理

    比如 Redis,临时性或持久性键值存储,性能更超越大名鼎鼎的memcached。


    2、以关系型数据库为辅,NoSql为主

    以NoSql为数据源,将数据写入NoSql,然后通过复制/同步机制,再将数据同步到关系型数据库里。

    好处是简单,灵活,高性能,易扩展。

    缺点是有数据同步问题,且技术要求高,因为NoSql缺乏容易使用的复制同步接口。


    3、以关系型数据库为主,NoSql为辅

    1)NoSql作为镜像

    数据同时写入关系型数据库和NoSql,NoSql数据库主要用于读取。这样实现读写分离,可以利用NoSql的高性能来应付大量的查询。


    2)数据拆分存储到关系型数据库和NoSql数据库

    比如,关系型数据库只存储需要查询的小字段,NoSQL存储所有数据。

    这种架构模式把RDBMS和NoSQL的作用进行了融合,各司其职,让关系型数据库专门负责处理擅长的关系存储,NoSQL作为数据的存储。优点是

    节省了主数据库(关系型数据库)的IO开销,有利于主数据库的备份和恢复,也使整个架构的性能、扩展性都得到提升。


  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/leftfist/p/4257877.html
Copyright © 2011-2022 走看看