本文概述了JavaGuide存储库中涵盖的数据库技术。我们将探讨关系型数据库(主要是MySQL)和NoSQL数据库(主要是Redis),包括它们的基础、架构和关键概念。有关更具体的主题,例如详细的优化技术或高级数据库配置,请参阅相应的数据库特定页面。
关系型数据库将数据存储在具有预定义架构的表中,数据以行和列的形式组织。它们通过主键和外键强制表之间的关系,确保数据的完整性。
来源: docs/database/mysql/mysql-questions-01.md
关系型数据库建立在关系模型之上,该模型在存储的数据之间建立连接(一对一、一对多、多对多)。在关系型数据库中,数据存储在各种表中(例如用户表),其中每一行包含一个记录(例如一个用户的信息)。
大多数关系型数据库使用SQL(结构化查询语言)进行数据操作,并支持事务的ACID(原子性、一致性、隔离性、持久性)属性。
常见的关系型数据库系统包括MySQL、PostgreSQL、Oracle、SQL Server和SQLite(后者用于存储微信的本地聊天记录)。
来源: docs/database/mysql/mysql-questions-01.md:19-33
MySQL是一个广泛使用的关系型数据库管理系统,主要用于应用程序数据的持久化存储,例如用户信息。由于其开源、免费和成熟的特性,MySQL在各种系统中得到了广泛应用。根据通用公共许可证(GPL)的规定,任何人都可以根据自己的需求下载和修改它。MySQL的默认端口是3306。
MySQL提供了几个优势:
来源: docs/database/mysql/mysql-questions-01.md:50-72
MySQL遵循客户端-服务器架构,其中SQL查询经过多个处理阶段。下图展示了SQL语句在MySQL内的执行流程。
MySQL的核心架构包括:
InnoDB是MySQL的默认存储引擎,对于大多数场景都是最佳选择。
来源: docs/database/mysql/mysql-questions-01.md:191-206
MySQL通过其插件架构支持多种存储引擎。您可以使用SHOW ENGINES命令查看所有支持的引擎。自5.5.5版本以来,InnoDB一直是MySQL的默认存储引擎。在此之前,MyISAM是默认引擎。
InnoDB和MyISAM之间的主要区别在于:
| 功能 | InnoDB | MyISAM |
|---|---|---|
| 行级锁定 | 是 | 否,只有表级锁定 |
| 事务支持 | 是 | 否 |
| 外键支持 | 是 | 否 |
| 崩溃恢复 | 是 | 否 |
| MVCC支持 | 是 | 否 |
| 索引实现 | 数据文件即索引文件 | 索引和数据文件是分开的 |
| 性能 | 更适合读写混合环境 | 更适合读密集型、简单查询 |
InnoDB使用缓冲池缓存数据和索引页,而MyISAM使用键缓存仅缓存索引页,不缓存数据页。
来源: docs/database/mysql/mysql-questions-01.md:208-351
MySQL数据类型可大致分为三类:
最常用的数据类型是:
| 类型 | 存储 | 范围 | 用途 |
|---|---|---|---|
| CHAR | 固定长度 | 0-255个字符 | 固定长度字符串,如密码 |
| VARCHAR | 可变长度 | 0-65,535个字符 | 可变长度字符串,如姓名 |
| TEXT | 可变长度 | 最多65,535字节 | 较长的文本,如文章 |
| INT | 4 字节 | -2,147,483,648 到 2,147,483,647 | 整数值 |
| DECIMAL | 可变 | 取决于精度 | 精确的数值,如货币 |
| DATETIME | 8 字节 | 1000-01-01 00:00:00 到 9999-12-31 23:59:59 | 日期和时间值 |
来源: docs/database/mysql/mysql-questions-01.md:73-189
来源: docs/database/mysql/mysql-questions-01.md:97-154
索引是一种用于快速数据检索和搜索的数据结构,本质上是一种排序的数据结构。索引通过减少需要扫描的数据量,显著提高了查询性能。
来源: docs/database/mysql/mysql-index.md:14-22, docs/database/mysql/mysql-index.md:137-165
虽然哈希表、二叉搜索树和红黑树都可以用作索引结构,但MySQL主要在InnoDB和MyISAM存储引擎中都使用B+树进行索引。
与擅长等值搜索但无法处理范围查询的哈希索引不同,B+树可以高效地同时支持等值和范围查询。
来源: docs/database/mysql/mysql-index.md:38-128
MySQL支持多种索引类型:
来源: docs/database/mysql/mysql-index.md:137-165
InnoDB的索引实现方式与MyISAM不同:
这种实现方式解释了为什么在InnoDB表中选择合适的主键很重要——主键会影响所有二级索引。
来源: docs/database/mysql/mysql-index.md:122-136, docs/database/mysql/mysql-questions-01.md:266-326
事务是操作的逻辑单元,必须原子地执行——要么所有操作都成功,要么都不成功。经典的例子是银行转账,其中借记和贷记操作必须同时成功或失败。
来源: docs/database/mysql/mysql-questions-01.md:420-442
MySQL的InnoDB引擎支持ACID属性:
需要注意的是,原子性、隔离性和持久性是数据库的属性,而一致性是应用程序的属性,它可能依赖于数据库的属性。
来源: docs/database/mysql/mysql-questions-01.md:461-488
SQL标准定义了四种隔离级别来解决并发问题:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 |
| READ COMMITTED | 避免 | 可能 | 可能 |
| REPEATABLE READ | 避免 | 避免 | 可能* |
| SERIALIZABLE | 避免 | 避免 | 避免 |
*InnoDB对REPEATABLE READ的实现可以通过MVCC和Next-Key Locks来防止幻读。
MySQL的InnoDB默认隔离级别是REPEATABLE READ。
来源: docs/database/mysql/mysql-questions-01.md:490-592, docs/database/mysql/transaction-isolation-level.md
MySQL使用两种主要机制进行并发控制:
MVCC通过维护数据的多个版本,并根据事务时间戳和隔离级别确定哪些版本对事务可见来工作。
来源: docs/database/mysql/mysql-questions-01.md:534-553
Redis(REmote DIctionary Server)是一个开源的、BSD许可的NoSQL数据库,用C语言编写。与传统数据库不同,Redis将数据存储在内存中(可选择持久化),提供极快的读写操作。它被广泛用作分布式缓存。
来源: docs/database/redis/redis-questions-01.md:19-27
Redis的卓越性能得益于:
来源: docs/database/redis/redis-questions-01.md:36-48
Redis支持多种数据结构,每种数据结构都针对特定用例进行了优化:
每种数据结构都有专门的命令用于高效的操纵和检索。
来源: docs/database/redis/redis-questions-01.md:313-383, docs/database/redis/redis-data-structures-01.md
虽然Redis主要用作缓存,但它还有其他几种应用:
来源: docs/database/redis/redis-questions-01.md:152-161
虽然Redis可以实现消息队列,但与专用消息中间件相比,它存在一些限制:
对于严肃的消息队列需求,建议使用RocketMQ或Kafka等专用解决方案,而不是Redis。
来源: docs/database/redis/redis-questions-01.md:166-262
Redis事务允许将多个命令捆绑在一起,按顺序执行,而不被中断。然而,Redis事务与传统数据库事务有很大不同:
Redis事务使用MULTI开始事务,然后是排队的命令,最后是EXEC执行所有命令。您可以使用WATCH进行乐观锁定,使用DISCARD取消事务。
来源: docs/database/redis/redis-questions-02.md:19-91
在选择不同的数据库技术时,请考虑以下因素:
关系型数据库在以下方面表现出色:
Redis在以下方面表现出色:
一种常见的模式是同时使用MySQL和Redis。
来源: docs/database/redis/redis-questions-01.md:97-161
MySQL优化涉及几个关键领域:
模式设计:
索引策略:
查询优化:
服务器配置:
来源: docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md
Redis优化侧重于:
内存管理:
连接管理:
数据结构选择:
持久化配置:
来源: docs/database/redis/redis-questions-02.md
MySQL等关系型数据库和Redis等NoSQL数据库在现代应用程序架构中都扮演着重要角色。MySQL为具有复杂关系和结构化数据提供了强大的存储,而Redis则在高速操作、缓存和专用数据结构方面表现出色。
了解每种技术的优点和局限性,可以实现有效的数据库选择和使用模式。许多应用程序可以从混合方法中受益,使用MySQL进行持久化存储,使用Redis进行缓存和专用功能。
刷新此 Wiki
最后索引时间2025年4月17日(ff77b0)