1. 1. 数据库概述
    1. 1.1. 数据库的发展历程
    2. 1.2. 数据库系统的特点
  2. 2. 数据库系统结构
    1. 2.1. 数据库系统的三级模式结构
    2. 2.2. 数据库系统的二级映像
  3. 3. 数据模型
    1. 3.1. 数据模型的分类
    2. 3.2. 实体-联系模型(E-R 模型)
      1. 3.2.1. 基本概念
      2. 3.2.2. 联系的类型
    3. 3.3. 关系模型
      1. 3.3.1. 基本概念
      2. 3.3.2. 关系的完整性约束
  4. 4. 关系数据库
    1. 4.1. 关系代数
      1. 4.1.1. 基本运算
      2. 4.1.2. 组合运算
  5. 5. SQL 语言
    1. 5.1. SQL 的分类
    2. 5.2. 数据定义语言(DDL)
      1. 5.2.1. 创建数据库
      2. 5.2.2. 选择数据库
      3. 5.2.3. 创建表
      4. 5.2.4. 修改表
      5. 5.2.5. 删除表
    3. 5.3. 数据操纵语言(DML)
      1. 5.3.1. 插入数据
      2. 5.3.2. 查询数据
        1. 5.3.2.1. 基本查询
        2. 5.3.2.2. 条件查询
        3. 5.3.2.3. 排序查询
        4. 5.3.2.4. 聚合查询
        5. 5.3.2.5. 分组查询
        6. 5.3.2.6. 连接查询
        7. 5.3.2.7. 子查询
      3. 5.3.3. 更新数据
      4. 5.3.4. 删除数据
    4. 5.4. 数据控制语言(DCL)
      1. 5.4.1. 授权
      2. 5.4.2. 撤销权限
    5. 5.5. 事务控制语言(TCL)
      1. 5.5.1. 事务的基本操作
  6. 6. 数据库设计
    1. 6.1. 数据库设计的步骤
    2. 6.2. 关系数据库设计理论
      1. 6.2.1. 函数依赖
      2. 6.2.2. 范式
      3. 6.2.3. 规范化的过程
  7. 7. 数据库完整性
    1. 7.1. 数据库完整性的类型
    2. 7.2. 触发器
      1. 7.2.1. 创建触发器
  8. 8. 数据库索引
    1. 8.1. 索引的类型
    2. 8.2. 索引的优缺点
      1. 8.2.1. 优点
      2. 8.2.2. 缺点
    3. 8.3. 创建和删除索引
    4. 8.4. 索引的使用原则
  9. 9. 数据库事务
    1. 9.1. 事务的特性(ACID)
    2. 9.2. 事务的隔离级别
    3. 9.3. 设置事务隔离级别
  10. 10. 并发控制
    1. 10.1. 并发问题
    2. 10.2. 并发控制技术
      1. 10.2.1. 锁机制
      2. 10.2.2. 封锁协议
      3. 10.2.3. 死锁
      4. 10.2.4. 死锁的预防
      5. 10.2.5. 死锁的检测和解除
  11. 11. 数据库恢复
    1. 11.1. 数据库故障的类型
    2. 11.2. 数据库恢复的技术
      1. 11.2.1. 数据转储
      2. 11.2.2. 日志文件
      3. 11.2.3. 恢复策略
  12. 12. 数据库安全
    1. 12.1. 数据库安全的层次
    2. 12.2. 数据库安全的措施
  13. 13. 数据库优化
    1. 13.1. 查询优化
    2. 13.2. 存储优化
    3. 13.3. 配置优化
  14. 14. NoSQL 数据库
    1. 14.1. NoSQL 数据库的分类
    2. 14.2. NoSQL 数据库的特点
    3. 14.3. 关系数据库与 NoSQL 数据库的比较
  15. 15. 大数据相关技术
    1. 15.1. Hadoop
      1. 15.1.1. Hadoop 的核心组件
    2. 15.2. Spark
      1. 15.2.1. Spark 的核心组件
  16. 16. 数据库面试题
    1. 16.1. 1. 什么是数据库?数据库管理系统的主要功能是什么?
    2. 16.2. 2. 关系数据库的基本概念是什么?
    3. 16.3. 3. SQL 语言的分类有哪些?
    4. 16.4. 4. 什么是事务?事务的 ACID 特性是什么?
    5. 16.5. 5. 数据库的隔离级别有哪些?
    6. 16.6. 6. 什么是索引?索引的优缺点是什么?
    7. 16.7. 7. 什么是范式?常见的范式有哪些?
    8. 16.8. 8. 什么是 NoSQL 数据库?与关系数据库有什么区别?
  17. 17. 参考资料
  18. 18. 总结

数据库

数据库概述

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。数据库管理系统(Database Management System,DBMS)是用于管理数据库的软件系统。

数据库的发展历程

  1. 人工管理阶段:数据不保存,由应用程序管理
  2. 文件系统阶段:数据以文件形式存储,由文件系统管理
  3. 数据库系统阶段:数据由 DBMS 统一管理,实现了数据共享和独立性
  4. 高级数据库阶段:出现了分布式数据库、面向对象数据库、NoSQL 数据库等

数据库系统的特点

  • 数据结构化:数据按照一定的数据模型组织
  • 数据共享性高:多个用户可以同时访问数据
  • 数据独立性强:包括物理独立性和逻辑独立性
  • 数据由 DBMS 统一管理和控制:提供安全性、完整性、并发控制和恢复功能

数据库系统结构

数据库系统的三级模式结构

  1. 外模式(External Schema):用户视图,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述
  2. 模式(Schema):逻辑模式,是数据库中全体数据的逻辑结构和特征的描述
  3. 内模式(Internal Schema):存储模式,是数据物理结构和存储方式的描述

数据库系统的二级映像

  1. 外模式/模式映像:保证数据的逻辑独立性
  2. 模式/内模式映像:保证数据的物理独立性

数据模型

数据模型是对现实世界数据特征的抽象,用于描述数据的结构、操作和约束。

数据模型的分类

  1. 概念模型:用于描述现实世界,如实体-联系模型(E-R 模型)
  2. 逻辑模型:用于数据库设计,如层次模型、网状模型、关系模型、面向对象模型
  3. 物理模型:用于描述数据的物理存储结构

实体-联系模型(E-R 模型)

E-R 模型是一种概念模型,用于描述现实世界的实体、属性和联系。

基本概念

  • 实体(Entity):客观存在并可相互区别的事物,如学生、课程
  • 属性(Attribute):实体所具有的某一特性,如学生的学号、姓名
  • 联系(Relationship):实体之间的关联关系,如学生选课

联系的类型

  • 一对一联系(1:1):如一个学生只能有一个学生证,一个学生证只能属于一个学生
  • 一对多联系(1:n):如一个班级有多个学生,一个学生只能属于一个班级
  • 多对多联系(m:n):如一个学生可以选多门课程,一门课程可以被多个学生选

关系模型

关系模型是目前最常用的逻辑模型,以关系(表)的形式组织数据。

基本概念

  • 关系(Relation):对应于数据库中的表
  • 元组(Tuple):表中的一行数据
  • 属性(Attribute):表中的一列数据
  • 域(Domain):属性的取值范围
  • 关系模式:对关系的描述,如学生(学号, 姓名, 性别, 年龄, 班级)
  • 码(Key):能够唯一标识元组的属性或属性组合
    • 候选码:能够唯一标识元组的最小属性集
    • 主码:从候选码中选择的一个作为主要标识
    • 外码:一个关系中的属性,是另一个关系的主码

关系的完整性约束

  • 实体完整性:主码的值不能为空且唯一
  • 参照完整性:外码的值必须是另一个关系主码的有效值或空值
  • 用户定义的完整性:根据具体应用需求定义的约束

关系数据库

关系数据库是基于关系模型的数据库,目前主流的关系数据库包括 MySQL、Oracle、SQL Server、PostgreSQL 等。

关系代数

关系代数是一种用于操作关系的数学工具,包括基本运算和组合运算。

基本运算

  • 选择(Selection):从关系中选择满足条件的元组,σ 条件(关系)
  • 投影(Projection):从关系中选择若干属性列,π 属性列(关系)
  • 并(Union):两个关系的合并,要求两个关系具有相同的结构
  • 差(Difference):从一个关系中减去另一个关系的元组,要求两个关系具有相同的结构
  • 笛卡尔积(Cartesian Product):两个关系的所有可能组合

组合运算

  • 连接(Join):根据两个关系的共同属性进行连接
    • 等值连接:基于属性值相等的连接
    • 自然连接:基于相同属性名和值的等值连接,并去掉重复属性
    • 外连接:包括左外连接、右外连接和全外连接
  • 除(Division):用于查询满足一定条件的元组

SQL 语言

SQL(Structured Query Language)是结构化查询语言,用于管理关系数据库系统。

SQL 的分类

  1. 数据定义语言(DDL):用于定义数据库结构,如 CREATE、ALTER、DROP
  2. 数据操纵语言(DML):用于操作数据,如 INSERT、UPDATE、DELETE、SELECT
  3. 数据控制语言(DCL):用于控制数据访问权限,如 GRANT、REVOKE
  4. 事务控制语言(TCL):用于控制事务,如 COMMIT、ROLLBACK、SAVEPOINT

数据定义语言(DDL)

创建数据库

1
CREATE DATABASE student_db;

选择数据库

1
USE student_db;

创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 创建学生表
CREATE TABLE student (
student_id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(50) NOT NULL,
gender ENUM('男', '女') NOT NULL,
age INT CHECK (age > 0),
class_id INT,
FOREIGN KEY (class_id) REFERENCES class(class_id)
);

-- 创建班级表
CREATE TABLE class (
class_id INT PRIMARY KEY AUTO_INCREMENT,
class_name VARCHAR(50) NOT NULL,
teacher_name VARCHAR(50)
);

-- 创建课程表
CREATE TABLE course (
course_id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(50) NOT NULL,
credits INT NOT NULL
);

-- 创建选课表
CREATE TABLE student_course (
student_id INT,
course_id INT,
score DECIMAL(5, 2) CHECK (score >= 0 AND score <= 100),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES student(student_id),
FOREIGN KEY (course_id) REFERENCES course(course_id)
);

修改表

1
2
3
4
5
6
7
8
9
10
11
-- 添加列
ALTER TABLE student ADD phone VARCHAR(20);

-- 修改列
ALTER TABLE student MODIFY phone VARCHAR(11);

-- 删除列
ALTER TABLE student DROP COLUMN phone;

-- 添加约束
ALTER TABLE student ADD CONSTRAINT unique_name UNIQUE (student_name);

删除表

1
2
3
4
DROP TABLE IF EXISTS student_course;
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS class;

数据操纵语言(DML)

插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- 插入班级数据
INSERT INTO class (class_name, teacher_name) VALUES
('计算机1班', '张老师'),
('计算机2班', '李老师'),
('软件工程班', '王老师');

-- 插入学生数据
INSERT INTO student (student_name, gender, age, class_id) VALUES
('张三', '男', 18, 1),
('李四', '男', 19, 1),
('王五', '女', 18, 2),
('赵六', '女', 19, 3);

-- 插入课程数据
INSERT INTO course (course_name, credits) VALUES
('数据库原理', 3),
('操作系统', 4),
('计算机网络', 3),
('数据结构', 4);

-- 插入选课数据
INSERT INTO student_course (student_id, course_id, score) VALUES
(1, 1, 90),
(1, 2, 85),
(1, 3, 92),
(2, 1, 88),
(2, 2, 91),
(3, 1, 95),
(3, 3, 87),
(4, 2, 89),
(4, 4, 93);

查询数据

基本查询
1
2
3
4
5
6
7
8
9
10
11
-- 查询所有学生信息
SELECT * FROM student;

-- 查询学生的学号和姓名
SELECT student_id, student_name FROM student;

-- 带别名的查询
SELECT student_id AS 学号, student_name AS 姓名 FROM student;

-- 去重查询
SELECT DISTINCT class_id FROM student;
条件查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 查询年龄大于18的学生
SELECT * FROM student WHERE age > 18;

-- 查询计算机1班的学生
SELECT * FROM student WHERE class_id = 1;

-- 查询姓名包含'张'的学生
SELECT * FROM student WHERE student_name LIKE '%张%';

-- 查询年龄在18到20之间的学生
SELECT * FROM student WHERE age BETWEEN 18 AND 20;

-- 查询班级ID为1或2的学生
SELECT * FROM student WHERE class_id IN (1, 2);

-- 查询没有班级的学生
SELECT * FROM student WHERE class_id IS NULL;
排序查询
1
2
3
4
5
6
7
8
-- 按年龄升序排序
SELECT * FROM student ORDER BY age ASC;

-- 按年龄降序排序
SELECT * FROM student ORDER BY age DESC;

-- 按班级ID升序,年龄降序排序
SELECT * FROM student ORDER BY class_id ASC, age DESC;
聚合查询
1
2
3
4
5
6
7
8
9
10
11
-- 计算学生总数
SELECT COUNT(*) AS 学生总数 FROM student;

-- 计算平均年龄
SELECT AVG(age) AS 平均年龄 FROM student;

-- 计算最大年龄和最小年龄
SELECT MAX(age) AS 最大年龄, MIN(age) AS 最小年龄 FROM student;

-- 计算总学分
SELECT SUM(credits) AS 总学分 FROM course;
分组查询
1
2
3
4
5
6
7
8
-- 按班级分组,计算每个班级的学生人数
SELECT class_id, COUNT(*) AS 学生人数 FROM student GROUP BY class_id;

-- 按班级分组,计算每个班级的平均年龄
SELECT class_id, AVG(age) AS 平均年龄 FROM student GROUP BY class_id;

-- 按班级分组,筛选学生人数大于2的班级
SELECT class_id, COUNT(*) AS 学生人数 FROM student GROUP BY class_id HAVING COUNT(*) > 2;
连接查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 内连接:查询学生信息和班级信息
SELECT s.student_id, s.student_name, s.gender, s.age, c.class_name, c.teacher_name
FROM student s INNER JOIN class c ON s.class_id = c.class_id;

-- 左外连接:查询所有学生及其班级信息,包括没有班级的学生
SELECT s.student_id, s.student_name, s.gender, s.age, c.class_name, c.teacher_name
FROM student s LEFT JOIN class c ON s.class_id = c.class_id;

-- 右外连接:查询所有班级及其学生信息,包括没有学生的班级
SELECT s.student_id, s.student_name, s.gender, s.age, c.class_name, c.teacher_name
FROM student s RIGHT JOIN class c ON s.class_id = c.class_id;

-- 全外连接(MySQL不直接支持,可通过UNION实现)
SELECT s.student_id, s.student_name, s.gender, s.age, c.class_name, c.teacher_name
FROM student s LEFT JOIN class c ON s.class_id = c.class_id
UNION
SELECT s.student_id, s.student_name, s.gender, s.age, c.class_name, c.teacher_name
FROM student s RIGHT JOIN class c ON s.class_id = c.class_id;

-- 多表连接:查询学生选课信息,包括学生、课程和成绩
SELECT s.student_id, s.student_name, c.course_name, sc.score
FROM student s
INNER JOIN student_course sc ON s.student_id = sc.student_id
INNER JOIN course c ON sc.course_id = c.course_id;
子查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 查询年龄大于平均年龄的学生
SELECT * FROM student WHERE age > (SELECT AVG(age) FROM student);

-- 查询选了数据库原理课程的学生
SELECT * FROM student WHERE student_id IN (
SELECT student_id FROM student_course WHERE course_id = (
SELECT course_id FROM course WHERE course_name = '数据库原理'
)
);

-- 查询每个学生的选课数量
SELECT s.student_id, s.student_name, (
SELECT COUNT(*) FROM student_course WHERE student_id = s.student_id
) AS 选课数量
FROM student s;

更新数据

1
2
3
4
5
6
7
8
9
10
-- 更新张三的年龄为20
UPDATE student SET age = 20 WHERE student_name = '张三';

-- 更新计算机1班所有学生的年龄加1
UPDATE student SET age = age + 1 WHERE class_id = 1;

-- 更新选课成绩,将数据库原理课程的成绩加5分
UPDATE student_course SET score = score + 5 WHERE course_id = (
SELECT course_id FROM course WHERE course_name = '数据库原理'
);

删除数据

1
2
3
4
5
6
7
8
9
-- 删除姓名为张三的学生(注意:如果有外键约束,需要先删除关联数据)
DELETE FROM student_course WHERE student_id = (SELECT student_id FROM student WHERE student_name = '张三');
DELETE FROM student WHERE student_name = '张三';

-- 删除年龄大于20的学生
DELETE FROM student WHERE age > 20;

-- 删除计算机2班的所有学生
DELETE FROM student WHERE class_id = (SELECT class_id FROM class WHERE class_name = '计算机2班');

数据控制语言(DCL)

授权

1
2
3
4
5
6
7
8
9
10
11
-- 创建用户
CREATE USER 'db_user'@'localhost' IDENTIFIED BY 'password';

-- 授予用户对student_db数据库的所有权限
GRANT ALL PRIVILEGES ON student_db.* TO 'db_user'@'localhost';

-- 授予用户对student表的SELECT和INSERT权限
GRANT SELECT, INSERT ON student_db.student TO 'db_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

撤销权限

1
2
3
4
5
6
7
8
-- 撤销用户对student表的INSERT权限
REVOKE INSERT ON student_db.student FROM 'db_user'@'localhost';

-- 撤销用户对student_db数据库的所有权限
REVOKE ALL PRIVILEGES ON student_db.* FROM 'db_user'@'localhost';

-- 删除用户
DROP USER 'db_user'@'localhost';

事务控制语言(TCL)

事务的基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- 开始事务
START TRANSACTION;

-- 执行一系列操作
INSERT INTO student (student_name, gender, age, class_id) VALUES ('孙七', '男', 20, 1);
UPDATE student SET age = 21 WHERE student_name = '李四';

-- 提交事务
COMMIT;

-- 开始事务
START TRANSACTION;

-- 执行一系列操作
DELETE FROM student WHERE student_name = '王五';
UPDATE class SET teacher_name = '刘老师' WHERE class_id = 1;

-- 回滚事务
ROLLBACK;

-- 开始事务
START TRANSACTION;

-- 执行操作
INSERT INTO student (student_name, gender, age, class_id) VALUES ('周八', '女', 19, 2);

-- 创建保存点
SAVEPOINT sp1;

-- 执行更多操作
UPDATE student SET age = 20 WHERE student_name = '周八';

-- 回滚到保存点
ROLLBACK TO sp1;

-- 提交事务
COMMIT;

数据库设计

数据库设计是指根据用户需求,设计数据库的结构和关系。

数据库设计的步骤

  1. 需求分析:收集和分析用户需求
  2. 概念结构设计:设计 E-R 模型
  3. 逻辑结构设计:将 E-R 模型转换为关系模型
  4. 物理结构设计:设计数据库的物理存储结构
  5. 数据库实施:创建数据库、表和加载数据
  6. 数据库运行和维护:监控和维护数据库

关系数据库设计理论

关系数据库设计理论用于指导关系数据库的设计,确保数据库的结构合理、冗余度低、操作高效。

函数依赖

  • 函数依赖:如果属性集 X 的值确定后,属性集 Y 的值也随之确定,则称 Y 函数依赖于 X,记作 X→Y
  • 完全函数依赖:Y 完全函数依赖于 X,当且仅当 Y 函数依赖于 X,且 Y 不函数依赖于 X 的任何真子集
  • 部分函数依赖:Y 部分函数依赖于 X,当且仅当 Y 函数依赖于 X,但 Y 函数依赖于 X 的某个真子集
  • 传递函数依赖:如果 X→Y,Y→Z,且 Y 不函数依赖于 Z,X 不函数依赖于 Z,则称 Z 传递函数依赖于 X

范式

范式是关系模式的规范化程度,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC 范式(BCNF)等。

  • 第一范式(1NF):关系中的每个属性都是不可分割的原子值
  • 第二范式(2NF):在 1NF 的基础上,消除了非主属性对主码的部分函数依赖
  • 第三范式(3NF):在 2NF 的基础上,消除了非主属性对主码的传递函数依赖
  • BC 范式(BCNF):在 3NF 的基础上,消除了主属性对主码的部分和传递函数依赖

规范化的过程

规范化的过程是将低范式的关系模式转换为高范式的关系模式,通常通过分解关系模式实现。

数据库完整性

数据库完整性是指数据库中数据的正确性、一致性和有效性。

数据库完整性的类型

  1. 实体完整性:通过主键约束实现
  2. 参照完整性:通过外键约束实现
  3. 用户定义的完整性:通过 CHECK 约束、UNIQUE 约束、NOT NULL 约束等实现

触发器

触发器是一种特殊的存储过程,在指定的事件发生时自动执行。

创建触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 创建触发器,在删除学生前先删除其选课记录
DELIMITER //
CREATE TRIGGER before_student_delete
BEFORE DELETE ON student
FOR EACH ROW
BEGIN
DELETE FROM student_course WHERE student_id = OLD.student_id;
END //
DELIMITER ;

-- 创建触发器,在插入学生时记录日志
DELIMITER //
CREATE TRIGGER after_student_insert
AFTER INSERT ON student
FOR EACH ROW
BEGIN
INSERT INTO student_log (student_id, student_name, operation, operation_time)
VALUES (NEW.student_id, NEW.student_name, 'INSERT', NOW());
END //
DELIMITER ;

数据库索引

索引是一种数据结构,用于提高数据库查询的效率。

索引的类型

  1. B 树索引:最常用的索引类型,适用于范围查询
  2. 哈希索引:适用于等值查询
  3. 全文索引:适用于文本搜索
  4. 空间索引:适用于地理空间数据查询

索引的优缺点

优点

  • 提高查询速度
  • 加速表与表之间的连接
  • 减少排序和分组的时间

缺点

  • 占用额外的存储空间
  • 降低插入、更新和删除操作的速度
  • 增加了数据库维护的开销

创建和删除索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 创建索引
CREATE INDEX idx_student_name ON student(student_name);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_student_id ON student(student_id);

-- 创建复合索引
CREATE INDEX idx_student_class_age ON student(class_id, age);

-- 创建全文索引
CREATE FULLTEXT INDEX idx_course_name ON course(course_name);

-- 删除索引
DROP INDEX idx_student_name ON student;

索引的使用原则

  1. 对经常用于查询条件的列创建索引
  2. 对经常用于连接的列创建索引
  3. 对经常用于排序和分组的列创建索引
  4. 避免对频繁更新的列创建索引
  5. 避免对取值范围小的列创建索引
  6. 考虑创建复合索引,并注意列的顺序

数据库事务

事务是数据库操作的基本单位,是一系列不可分割的操作的集合。

事务的特性(ACID)

  1. 原子性(Atomicity):事务要么全部执行,要么全部不执行
  2. 一致性(Consistency):事务执行前后,数据库的完整性约束保持不变
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务
  4. 持久性(Durability):事务提交后,其结果应永久保存到数据库中

事务的隔离级别

事务的隔离级别用于控制并发事务之间的影响程度。

  1. 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读、不可重复读和幻读
  2. 读已提交(Read Committed):只允许读取已提交的数据,防止脏读,但可能导致不可重复读和幻读
  3. 可重复读(Repeatable Read):确保同一事务中多次读取同一数据的结果一致,防止脏读和不可重复读,但可能导致幻读
  4. 串行化(Serializable):最严格的隔离级别,确保事务串行执行,防止脏读、不可重复读和幻读

设置事务隔离级别

1
2
3
4
5
-- 设置全局事务隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 设置会话事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

并发控制

并发控制是指管理多个并发事务的执行,确保事务的 ACID 特性,防止并发问题。

并发问题

  1. 脏读(Dirty Read):读取到其他事务未提交的数据
  2. 不可重复读(Non-Repeatable Read):同一事务中多次读取同一数据,结果不一致
  3. 幻读(Phantom Read):同一事务中多次查询同一条件,结果集的行数不一致

并发控制技术

锁机制

  • 共享锁(S 锁):用于读取数据,多个事务可以同时获取共享锁
  • 排他锁(X 锁):用于修改数据,只有一个事务可以获取排他锁

封锁协议

  • 一级封锁协议:事务在修改数据前必须获取排他锁,直到事务结束才释放
  • 二级封锁协议:在一级封锁协议的基础上,事务在读取数据前必须获取共享锁,读取后立即释放
  • 三级封锁协议:在一级封锁协议的基础上,事务在读取数据前必须获取共享锁,直到事务结束才释放
  • 两段锁协议:所有事务必须分两个阶段获取锁和释放锁

死锁

死锁是指多个事务因竞争资源而造成的一种僵局,若无外力作用,这些事务都将无法继续执行。

死锁的预防

  • 一次封锁法:事务在开始执行时就获取所有需要的锁
  • 顺序封锁法:事务按预先规定的顺序获取锁

死锁的检测和解除

  • 死锁检测:通过资源分配图检测死锁
  • 死锁解除:选择一个或多个事务进行回滚,释放资源

数据库恢复

数据库恢复是指在数据库发生故障后,将数据库恢复到一致性状态的过程。

数据库故障的类型

  1. 事务故障:事务在执行过程中发生的故障
  2. 系统故障:系统崩溃导致的故障
  3. 介质故障:存储介质损坏导致的故障
  4. 计算机病毒:病毒感染导致的故障

数据库恢复的技术

数据转储

  • 完全转储:转储整个数据库
  • 增量转储:只转储上次转储后修改的数据
  • 差量转储:只转储上次完全转储后修改的数据

日志文件

日志文件用于记录数据库的操作,是数据库恢复的重要依据。

恢复策略

  • 事务故障的恢复:通过撤销(UNDO)事务实现
  • 系统故障的恢复:通过撤销未提交的事务和重做(REDO)已提交的事务实现
  • 介质故障的恢复:通过数据转储和日志文件实现

数据库安全

数据库安全是指保护数据库免受未经授权的访问、修改和破坏。

数据库安全的层次

  1. 物理层安全:保护数据库的物理存储设备
  2. 网络层安全:保护数据库的网络访问
  3. 操作系统层安全:保护数据库所在的操作系统
  4. 数据库系统层安全:保护数据库管理系统
  5. 应用层安全:保护数据库应用程序

数据库安全的措施

  1. 用户认证:验证用户的身份
  2. 授权:控制用户对数据库的访问权限
  3. 视图:限制用户只能访问数据库的特定部分
  4. 审计:记录用户对数据库的操作
  5. 数据加密:对敏感数据进行加密存储
  6. 防火墙:防止未经授权的网络访问

数据库优化

数据库优化是指提高数据库的性能,包括查询优化、存储优化、配置优化等。

查询优化

  1. 合理使用索引
  2. 避免全表扫描
  3. 优化 SQL 语句
  4. 使用分页查询
  5. 避免在查询条件中使用函数

存储优化

  1. 合理设计表结构
  2. 选择合适的数据类型
  3. 避免数据冗余
  4. 定期清理无用数据
  5. 使用分区表

配置优化

  1. 调整数据库参数
  2. 增加内存分配
  3. 优化磁盘 I/O
  4. 使用连接池

NoSQL 数据库

NoSQL(Not Only SQL)数据库是指非关系型数据库,用于处理大规模数据和高并发访问。

NoSQL 数据库的分类

  1. 键值存储数据库:如 Redis、Memcached
  2. 文档存储数据库:如 MongoDB、CouchDB
  3. 列存储数据库:如 HBase、Cassandra
  4. 图存储数据库:如 Neo4j、JanusGraph

NoSQL 数据库的特点

  • 灵活的数据模型
  • 高可扩展性
  • 高性能
  • 高可用性

关系数据库与 NoSQL 数据库的比较

特性 关系数据库 NoSQL 数据库
数据模型 结构化,表 灵活,键值、文档、列、图
事务支持 完全支持 ACID 部分支持,如最终一致性
可扩展性 垂直扩展 水平扩展
性能 适用于复杂查询 适用于高并发、大数据量
适用场景 传统应用、复杂查询 Web 应用、大数据、实时分析

大数据相关技术

Hadoop

Hadoop 是一个分布式计算框架,用于处理大规模数据。

Hadoop 的核心组件

  • HDFS:Hadoop 分布式文件系统,用于存储大规模数据
  • MapReduce:分布式计算框架,用于处理大规模数据
  • YARN:资源管理系统,用于管理集群资源
  • HBase:分布式列存储数据库

Spark

Spark 是一个快速的分布式计算框架,比 Hadoop MapReduce 更快。

Spark 的核心组件

  • Spark Core:核心引擎
  • Spark SQL:用于处理结构化数据
  • Spark Streaming:用于处理流数据
  • MLlib:机器学习库
  • GraphX:图计算库

数据库面试题

1. 什么是数据库?数据库管理系统的主要功能是什么?

数据库是按照数据结构来组织、存储和管理数据的仓库。数据库管理系统的主要功能包括数据定义、数据操纵、数据控制、数据库运行管理和数据库维护。

2. 关系数据库的基本概念是什么?

关系数据库是基于关系模型的数据库,以关系(表)的形式组织数据。基本概念包括关系(表)、元组(行)、属性(列)、域、关系模式、码(主键、外键)等。

3. SQL 语言的分类有哪些?

SQL 语言分为数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和事务控制语言(TCL)。

4. 什么是事务?事务的 ACID 特性是什么?

事务是数据库操作的基本单位,是一系列不可分割的操作的集合。事务的 ACID 特性包括原子性、一致性、隔离性和持久性。

5. 数据库的隔离级别有哪些?

数据库的隔离级别包括读未提交、读已提交、可重复读和串行化。

6. 什么是索引?索引的优缺点是什么?

索引是一种数据结构,用于提高数据库查询的效率。优点包括提高查询速度、加速表与表之间的连接、减少排序和分组的时间;缺点包括占用额外的存储空间、降低插入、更新和删除操作的速度、增加了数据库维护的开销。

7. 什么是范式?常见的范式有哪些?

范式是关系模式的规范化程度,用于指导关系数据库的设计。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和 BC 范式(BCNF)。

8. 什么是 NoSQL 数据库?与关系数据库有什么区别?

NoSQL(Not Only SQL)数据库是指非关系型数据库,用于处理大规模数据和高并发访问。与关系数据库相比,NoSQL 数据库具有灵活的数据模型、高可扩展性、高性能和高可用性,但对事务的支持较弱。

参考资料

  1. 《数据库系统概论》(第五版),王珊 萨师煊 编著
  2. 《SQL 必知必会》(第四版),Ben Forta 著
  3. 《高性能 MySQL》(第三版),Baron Schwartz 等著
  4. 《NoSQL 精粹》,Pramod J. Sadalage 等著
  5. 《Hadoop 权威指南》(第四版),Tom White 著

总结

数据库是现代信息技术的重要组成部分,掌握数据库的基本概念、原理和技术对于理解和应用数据库至关重要。本文从数据库概述入手,详细介绍了数据库系统结构、数据模型、关系数据库、SQL 语言、数据库设计、数据库完整性、数据库索引、数据库事务、并发控制、数据库恢复、数据库安全、数据库优化、NoSQL 数据库和大数据相关技术,并解答了一些常见的数据库面试题。

通过学习本文,读者可以对数据库有一个全面的认识,掌握 SQL 语言的使用,了解数据库设计和优化的方法,为进一步深入学习数据库技术打下基础。数据库技术正在不断发展,新的技术和应用不断涌现,读者应该保持学习的热情,关注数据库技术的最新发展。