关系型数据库与非关系型数据库
今天来对比下关系型数据库和非关系型数据库。包括各自的优势和劣势。
关系型数据库优势
- 关系型数据库的性能不低,它具有非常高的通用性和非常高的性能。
- 关系型数据库支持事务,保持数据的一致性。
- 由于以标准化为前提,数据更新的开销很小。
- 支持JOIN查询
关系型数据库不擅长处理
大量数据的写入处理
数据库扩展中,使用主从模式可以到达规模化,但在写入上遇到困难。主数据库负责写,多个从数据库负责读。当写移到瓶颈时,通过扩展主数据库就不简单了。为了简单起见,考虑二元主数据库。那么主数据库在分表有两种方法。同一张表关联复制到两台服务器上
,或者,不同表分切到不同服务器上
。前者遇到的问题就是,写入时两台服务器可能遇到数据不一致的情况(需要对每个表的处理分配到不同的主服务器上,这个不简单)。后者数据分配上直接在内存中完成,减少磁盘I/O操作,但,很难进行JOIN操作。分别存储在不同服务器上的表之间无法进行JOIN操作
。表在有数据更新的情况下做索引和表结构、模式(schema)变更
为了加快查询速作索引,为了增加必要的字段作表的结果变更,这些处理都需要多表进行共享锁
定。这两个操作期间,其他的数据变更操作都无法进行。
名称 | 锁的影响范围 | 别名 |
---|---|---|
共享锁 | 其他连接可以读取数据但不能修改数据 | 读锁 |
排他锁 | 其他连接无法读取数据,也不能修改数据 | 写锁 |
- 对简单查询需要返回快速结果的处理
关系型数据库专门使用SQL语言进行数据的读取,它需要对SQL语句进行解析,同时要多表进行锁定和解锁,这些都需要额外的开销。如果不使用SQL解析过程,也可以使用HandlerSocket。HandlerSocket is a NoSQL plugin for MySQL, working as a daemon inside the mysqld process, to accept tcp connections, and execute requests from clients. HandlerSocket does not support SQL queries; instead it supports simple CRUD operations on tables. 来自Github。
- 当应用业务本身字段并不固定的情况
上述讲了表结构变更期间数据更新无法进行,因此业务本身如果是字段不固定的情况,那么使用关系型数据库很难支持。尽管可以,但键表在有数据更新的情况下做索引和表结构、模式(schema)变更
。
非关系型数据库的优势
利于数据的分散
NoSQL在设计上不支持JOIN操作,各个数据都可以独立设计,不需要考虑它们的关联作用而把数据放到同一台服务器中,这样很利于数据分散到多台服务器中。由于分散到多台服务器中,大量数据的写入支持会更好。同时,数据的读入也是相当容易。流畅地对数据进行缓存
对数组类型数据进行高速处理
非关系型数据库不擅长处理
JOIN操作
严格的关系型数据库的事务支持
关系型数据库和非关系型数据库如何选择
NoSQL的出现不是为了取代关系型数据库,而是作为关系型数据库的补充。
在具体的业务情景下,关系型数据库擅长处理的就使用关系型数据库,关系型数据库不擅长处理的就使用非关系型数据库。