关系数据库、内存数据库、Nosql区别与联系

关系型数据库和Nosql区别
也许有人迷惑关系型数据库和非关系型数据库区别,其实非关系型数据库就是Nosql,所谓Nosql,就是(Not Only SQL),这个问题等价于关系型数据库和Nosql区别。
Nosql简介 Redis,Memchche,MongoDb的区别
1. 本质:非关系型数据库的实质:非关系型数据库产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能。
2. 存储方式:
关系型数据库是以表的形式存储数据的,nosql不是,它是大块的组合在一起,通常存储在数据集中,用的较多的是KeyValue的形式,也有文档结构和图结构
3. 存储结构
关系型数据库对应的是结构化数据,数据表都预先定义了结构(列的结构),结构描述了数据的形式和内容。这一点对数据建模至关重要,虽然预定义结构带来了可靠性和稳定性,但是修改这些数据比较困难。而Nosql数据库基于动态结构,可以很容易适应数据类型和结构的变化。
关系型数据库的数据存储为了更高的规范性,把数据分割为最小的关系表以避免重复,获得精简的空间利用。虽然管理起来很清晰,但是单个操作设计到多张表的时候,数据管理就显得有点麻烦。而Nosql数据存储在平面数据集中,数据经常可能会重复。单个数据库很少被分隔开,而是存储成了一个整体,这样整块数据更加便于读写。
4. 存储扩展
这可能是两者之间最大的区别,关系型数据库是纵向扩展,也就是说想要提高处理能力,要使用速度更快的计算机。因为数据存储在关系表中,操作的性能瓶颈涉及到多个表,需要通过提升计算机性能来克服。虽然有很大的扩展空间,但是最终会达到纵向扩展的上限。而Nosql数据库是横向扩展的,它的存储天然就是分布式的,可以通过给资源池添加更多的普通数据库来分担负载。
5. 查询方式
关系型数据库通过结构化查询语言来操作数据库(即SQL)。SQL支持数据库CURD操作的功能非常强大,是业界的标准用法。而Nosql查询以块为单元操作数据,使用的是非结构化查询语言(UnQl) ,它是没有标准的。关系型数据库表中主键的概念对应Nosql中存储文档的ID。关系型数据库使用预定义优化方式(比如索引)来加快查询操作。
6. 事务
关系型数据库遵循ACID(原子性,一致性,隔离性,持久性)规则,而Nosql数据库遵循BASE(基本可用,软/柔性事务,最终一致性)。由于关系型数据库的数据强一致性,所以对事务的支持很好。关系型数据库支持对事务原子性细粒度控制,并且易于回滚事务。而Nosql数据库是在CAP(一致性,可用性,分区容忍度)中任选两项,因为基于节点的分布式系统中,很难全部满足,所以对事务的支持不是很好,虽然也可以使用事务,但是并不是Nosql的闪光点。
7. 性能
关系型数据库为了维护数据的一致性付出了巨大的代价,读写性能比较差。在面对高并发读写性能差,面对海量数据的时候效率非常低。而Nosql存储的格式都是key-value类型的,并且存储在内存中,非常容易存储,而且对于数据的一致性是弱要求。Nosql无需sql的解析,提高了读写性能。
8. 授权方式
关系型数据库通常有SQL Server,Mysql,Oracle。主流的Nosql数据库有redis,memcache,MongoDb。大多数关系的关系型数据库都是付费并且价格昂贵,成本较大,而Nosql数据库通常都是开源的。
内存数据库和Nosql区别
1. nosql数据库与内存数据库
2. Nosql与内存数据库有交集,nosql不一定是内存数据库(如mongodb是文档型数据库),内存数据库不一定是Nosql,存在关系型的内存数据库,如SQLite,MySQL.
3. 内存数据库数据是完全保存在内存中的,一旦掉电,内存内数据将完全丢失,但是大部分内存数据库会定期将数据写入磁盘,对容灾有帮助,但是在发生掉电时未来得及刷入磁盘的数据将会丢失。
4. 内存数据库的优势在于高性能,所有的操作都是在内存中进行的,从而降低了IO操作,主要应用于一些对实时性要求很高的应用中。
本着“操作越少,速度越快”的原则,有人推荐直接使用内存集合而不使用内存数据库。
如果想提高速度,可以用Dictionary泛型类,
如果想查询灵活,可以用DataTable类,
其实如果多机应用的话,还不如直接用sql server,用内存数据更麻烦也不会提高速度。
出处:https://bbs.csdn.net/topics/390496963
但是内存数据的持久化将是一个问题
5. 内存数据库是怎么保证数据持久性的?
为避免链接失效,就先将主要内容转载过来了。
作者:黄开心
链接:https://www.zhihu.com/question/42241293/answer/155527974
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
所谓内存数据库,就是数据库放在内存中,磁盘作为log或者checkpoint备份。内存特性就是一旦掉电,全部数据就一夜回到解放前,所以数据持久化非常之重要。简单来说它保证了一个DBMS的可用性,更远一点说,谁选的持久化策略好,谁的性能就高,(可能同时)丢失的数据也少,谁就是内存数据库领域的霸主。所以现在都在提倡设计高性能内存数据库嘛~
常用的备份策略上一位答主介绍地差不多了,我再稍微啰嗦几句。
所谓快照snapshot,其实又可以叫checkpoint,意思是周期性地将内存数据中的数据同步到磁盘中,这个同步就比较讲究了:每一次同步是同步整个数据库还是只同步改变了的数据?如果增量同步,怎么选出哪些是改变了的数据页?同步的时候数据库事务处理要不要中断?不中断怎么保证异步检查点执行的正确性?这些问题都可以作为科研选题点。
另一种备份策略叫log(日志)。数据库领域最耳熟能详的log是什么?Write-ahead log,这是什么意思呢?即是说,每一次对内存数据库中的数据做操作之前,我都生成一个log,这个log里记录了我对数据的修改操作(log序号,页号/地址/键值/,旧值,新值),然后在整个修改数据的transaction提交之前保证将该log刷出到磁盘中,然后再刷出commit标志。这样一来,如果内存数据库中的事务commit失败?就可以通过log回滚的旧值恢复内存数据库中的上一个一致状态。如果commit成功刷出,恢复数据库就使用新值。当然,log也有很多的讲究?比如redo log, undo log,write-ahead log, write-behind log选哪个在当前环境下最优?log记录物理值还是记录逻辑值(逻辑值记录开销远小于物理值的记录)?系统恢复的时候怎么操作log最优?要不要搞分布式数据库的log?分布式环境下要不要动态做log(一会儿记录物理值一会儿记录逻辑值•••••)?这些也都是很好的选题点。
一般内存数据库为了低延迟和高吞吐量,会采用延迟回写持久化存储或者把日志临时先写到本地一个高速的持久化的存储(比如本地 3D XPoint)上之后再回写到持久化存储上。所以一般这类系统在某种程度上对容灾会有一定妥协,比如硬件损坏而非掉电更容易造成数据丢失的问题。因为内存是比较昂贵的资源,延迟的持久化存储可以写入分布式文件系统做多个副本,所以内存数据库一般不会做冗余而是在灾难发生后在其他节点通过分布式文件系统快速恢复。
相比较之下传统数据库会等待数据写入磁盘,甚至于校验后再返回认定写入成功。
另外内存数据库每个节点的存储上限会受到内存大小限制。换页操作不会在这类系统上发生。
因为数据全部要在内存中,内存数据库会着重考虑内存布局,压缩总占用甚至于偷 bit 存储一些标记位。一般也不会对内存进行对齐,并且对删除的数据也会设计专用的算法进行垃圾回收。
以上是我在读 RAMCloud 论文总结出来的一部分特点,其他我还观察到的是内存数据库倾向于使用 O(1) 的数据结构,比如哈希表而不是树形。这样可以在计算上进一步降低计算造成的延迟。
作者:Shisoft
链接:https://www.zhihu.com/question/42241293/answer/405378059
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
6. 几款主流 NoSql 数据库的对比
7. 特殊说明
Sqlite
Sqlite官方文档中有这样一句:An SQLite database is normally stored in a single ordinary disk file. However, in certain circumstances, the database might be stored in memory.
SQLite一般是以文件的形式存储数据,也可以将数据存储在内存中。
SQLite是关系型数据库。
Redis
Redis是这样介绍的:Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
Redis的数据是保存在内存中的
MySQL
MySQL has several “Engines”. In all engines, actions are performed in RAM. The Engines differ significantly in how good they are at making sure the data “persists” on disk.
ENGINE=MEMORY – This is not persistent; the data is found only in RAM. It is limited to some preset max size. On a power failure, all data (in a MEMORY table) is lost.
ENGINE=MyISAM – This is an old engine; it persists data to disk, but in the case of power failure, sometimes the indexes are corrupted and need ‘repairing’.
ENGINE=InnoDB – This is the preferred engine. It not only persists to disk but ‘guarantees’ consistency even across power failures.
MySQL也可以作为内存数据库使用

猜你喜欢

转载自blog.csdn.net/u010178308/article/details/80983275