数据库大观
数据库类型
关系型数据库
关系型数据库(Relational Database)是指一种使用表格关系来组织和存储数据的数据库。它有如下几大特点:
-
数据以表格形式存储。数据以行和列的形式组织,每行代表一个记录,每列代表一个字段(属性)。
-
关系。通过外键来建立表与表之间的关系,支持一对多、多对一或者多对多的关系。
-
结构化查询语言(SQL)。关系型数据库使用SQL作为标准查询语言,使用SQL语句实现对数据库的访问操作。
-
数据一致性。关系型数据库通常通过事务管理与约束来确保数据的一致性与完整性。
-
ACID特性。ACID原则:是关系型数据库管理系统(RDBMS)在处理事务时必须遵循的四个重要特性。
- 原子性(Atomicity):事务要么完全执行,要么完全不执行。如果事务中的任何一个操作失败都会导致整个事务的回滚。
- 一致性(Consistency):事务执行前后,数据库的状态应当保持一致。
- 隔离性(Isolation):并发执行的事务之间应当保持独立,互不干扰。不同的隔离级别可以控制这种行为,平衡并发性能与一致性。
- 持久性(Durability):一旦事务被提交,它对数据库的更改是永久的。即使数据库崩溃或出现故障。通常通过日志与其他机制来确保数据的持久性。
常见的关系型数据库管理系统包括MySQL、PostgreSQL、Oracle、SQL server、MariaDB(与MySQL同为一人设计)、DB2(安全性较好,常用于金融行业)等。
非关系型数据库(NOSQL)
非关系型数据库(NOSQL Database)是指不使用传统的关系模型来存储数据的数据库。主要有以下几个类别。
- 文档数据库:如MongoDSB与CouchDB,数据以JSON与BSON格式存储,适合存储结构灵活的文档。
- 键值数据库:如Redis与DynamoDB,数据以键值对的形式存储,适合快速读写操作,常用在缓存层。
- 列族数据库:如HBase,数据以列为存储单位,适合大规模的稀疏数据。
- 图形数据库:如Neo4j与ArangoDB,专门用来查询与存储图形结构的数据,适合社交网络与推荐系统。
还有一些开源的数据库:如分布式数据库ceph等。
非关系数据库通常用于处理结构化或者半结构化的数据,支持多种数据模型。许多非关系型数据库对事务的支持较弱,不遵循常用的ACID原则,而采用最终一致性模型。
非关系型数据库广泛用于社交网络、物联网、实时分析等场景,能够处理大量动态的数据。
MySQL数据库的特点
MySQL区别于其它数据库管理系统的一个很大的特点是支持插件式的存储引擎,支持如InnoDB、MyISAM、Memory等存储引擎。
MySQL通过其模块化的架构,将存储引擎作为插件实现,所有引擎都在统一的插件接口下工作,每个引擎都可以独立开发,遵循相同的API接口。
下面是MySQL几个存储引擎的特点:
1.InnoDB:
- 支持事务ACID,提供原子性、一致性、隔离性与持久性。
- 支持外键,确保数据的完整性。
- 采用行级锁,提高并发性能。
- 适合高并发和需要复杂事务的应用。
2.MyISAM:
- 不支持事务,采用表级锁。
- 读性能较好,适合以读为主的场景。
- 不支持外键约束,数据的一致性需要靠应用层来实现。
- 适合对数据读取频繁而更新不多的场景。
3.Memory:
- 数据存储在内存中,数据读写非常快。
- 不支持持久化,数据在服务器重启后会丢失。
- 适合需要快速访问但是数据量不大的场景。
MySQL服务器模型
MySQL服务器模型采用的是I/O复用+可伸缩的线程池,是实现网络服务器的经典模型。但是为什么不采用其他高效的服务器模型呢?
常见的网络服务器模型:
- select/epoll + 线程池
- 基于事件驱动的模型(libevent、libuv)
- 异步I/O + 协程(libuv + 协程库)
- Reactor模型
- 消息队列+工作线程(RabitMQ、kafka)
- 微服务、云原生等架构模型
关于上述问题,在 MySQL 的存储和处理过程中,磁盘 I/O 通常比网络 I/O 慢,因此需要确保两者的速率能够匹配,以避免瓶颈和性能下降,所以选择了select + 线程池的实现方法。
小结
关系型数据库在设计时注重数据的一致性与完整性,通常采用规范化原则,以减少数据冗余和更新异常的风险。MySQL 作为开源数据库,提供免费版和商业版,满足不同规模企业的需求。其广泛的社区支持和丰富的文档资源为开发者提供了解决问题和优化使用的有力支持。
非关系型数据库则允许数据以灵活的方式存储,适用于快速变化的应用场景,如社交媒体和实时分析。此外,许多非关系型数据库采用分布式架构,支持在多台服务器上水平扩展,从而实现大规模数据的高效存储与处理。