1. 数据库三大范式是什么?1.1 第一范式:1NF
1.2第二范式:2NF
1.3第三范式:3NF
2. MySQL有哪些索引类型,分别有什么作用?3. 事务的特性和隔离级别
1. 数据库三大范式是什么?
数据库三大范式是设计关系型数据库时的规范化原则,确保数据库结构的合理性和减少数据冗余。
这三大范式分别是:
- **第一范式(1NF):**
数据表中的所有列都是不可分割的原子数据项,即每一列都不可再分。这消除了重复的列。
- **第二范式(2NF):** 数据表中的非主键列完全依赖于主键。
这意味着每一行数据都能通过唯一的主键来识别,并且非主键列不能部分依赖于主键。
- **第三范式(3NF):** 数据表中的非主键列之间不存在传递依赖关系。
换句话说,非主键列不能依赖于其他非主键列。
1.1 第一范式:1NF
--第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线
每列的值具有原子性,不可再分割。
每个字段的值都只能是单一值
### 解释
学籍信息可以继续分割,所以不符合1NF
1.2第二范式:2NF
--第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)
如果表是单主键,那么主键以外的列必须完全依赖于主键;
如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
### 解释
学生id和课程id联合主键,非主键列【分数】完全依赖于主键【学生id和课程id】,学生id和课程id两个值才能决定score的值
但是【课程名字】只依赖于课程id,与学生id没有依赖关系,它不完全依赖于主键,只依赖于主键的一部分,不符合2NF
1.3第三范式:3NF
--第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式
第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;
也就是说:非主键列之间不能相关依赖,不存在传递依赖
### 解释
表中【部门名称】依赖于【部门id】,而【部门id】依赖于【id主键】,从而推出【部门名称】依赖于id(主键)
【部门名称】不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF
2. MySQL有哪些索引类型,分别有什么作用?
-主键索引(聚簇索引)---》主键,表不建立主键,也会有个隐藏字段是主键,是主键索引,
mysql是基于主键索引构建的b+树,如果没有主键,如果按主键搜索,速度是最快的---》一定会有主键索引
-辅助索引(普通索引,其他索引)-->咱们给某个自己加索引,django index=True,通过该字段查询,
会提高速度,如果字段 变化小(性别,年龄),不要建立普通索引
-CREATE INDEX index_id ON tb_student(id);
-前缀索引: 在创建索引时,使用列名后加括号,并在括号中指定要索引的前缀长度。
"""
-- 创建带有前缀索引的表
CREATE TABLE sample_table (
id INT PRIMARY KEY,
long_text_column VARCHAR(1000)
);
-- 创建前缀索引,索引长文本列的前 10 个字符
CREATE INDEX prefix_index ON sample_table (long_text_column(10));
-- 插入一些数据
INSERT INTO sample_table (id, long_text_column) VALUES
(1, 'This is a long text example'),
(2, 'Another example with a long text');
-- 查询使用前缀索引的列
SELECT * FROM sample_table WHERE long_text_column LIKE 'This%';
-唯一索引(unique)
-不是为了提高访问速度,而是为了避免数据出现重复
-唯一索引通常使用 UNIQUE 关键字
-CREATE UNIQUE INDEX index_id ON tb_student(id);
"""
-组合索引(联合索引)
-django 中:class Meta:
class Meta:
indexes = [
models.Index(fields=['field1', 'field2'], name='composite_index'),
]
-CREATE INDEX index_name
ON table_name (column1, column2, column3);
-全文索引-->基本不用---》
like %你%
全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。
在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
全文索引允许在索引列中插入重复值和空值。
不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。
创建全文索引使用 FULLTEXT 关键字
-倒排索引
-hash
-B+
3. 事务的特性和隔离级别
**事务的四个特性(ACID):**
- **原子性(Atomicity):** 事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
- **一致性(Consistency):**
事务执行后,数据库从一个一致的状态变到另一个一致的状态,保持数据库的完整性。
- **隔离性(Isolation):**
多个事务并发执行时,每个事务都应该感觉不到其他事务的存在,它们之间是隔离的。
- **持久性(Durability):** 事务一旦提交,对数据库的改变应该是永久性的。
**事务的隔离级别:**
- **READ UNCOMMITTED(读取未提交):**
允许读取其他事务未提交的数据,可能导致脏读、不可重复读和幻读。
- **READ COMMITTED(读取已提交):**
只能读取已经提交的数据,解决了脏读问题,但仍可能存在不可重复读和幻读。
- **REPEATABLE READ(可重复读):**
保证了在同一事务中多次读取同一数据时,结果保持一致。解决了脏读和不可重复读问题,但仍可能存在幻读。
- **SERIALIZABLE(可串行化):**
最高的隔离级别,通过强制事务串行执行来解决所有并发问题,包括脏读、不可重复读和幻读。
随着隔离级别的提高,事务的并发性能通常会降低,因为更高的隔离级别通常需要更多的锁和资源。
选择隔离级别时需要权衡一致性和性能的需求。
-- 创建银行账户表
CREATE TABLE bank_account (
id INT PRIMARY KEY,
account_name VARCHAR(50),
balance INT
);
-- 插入一些初始数据
INSERT INTO bank_account (id, account_name, balance) VALUES
(1, 'Alice', 1000),
(2, 'Bob', 1000);
-- 查看初始数据
SELECT * FROM bank_account;
-- 开始一个事务
START TRANSACTION;
-- 转账操作
UPDATE bank_account SET balance = balance - 100 WHERE id = 1;
UPDATE bank_account SET balance = balance + 100 WHERE id = 2;
-- 查看转账后的数据(未提交)
SELECT * FROM bank_account;
-- 提交事务
COMMIT;
-- 查看最终数据
SELECT * FROM bank_account;