Q:MySQL支持的数据引擎有哪些?有什么区别
- InnoDB(默认引擎)(一诺DB)
- 支持 事务(ACID 特性),通过
COMMIT
/ROLLBACK
保证数据一致性。 - 支持 行级锁(仅锁定修改的行,减少锁冲突)和 表级锁。
- 支持 外键约束,维护表之间的关联关系。
- 采用 聚簇索引(数据和索引存储在一起),查询效率高。
- 具备 崩溃恢复能力(通过 redo log 和 undo log 实现)。
- MyISAM(麦爱山姆)
- 不支持事务和外键。
- 只支持 表级锁(写入时锁定整张表,并发写入性能差)。
- 采用 非聚簇索引(数据和索引分开存储),查询速度快(尤其全表扫描)。
- 支持 全文索引(MySQL 5.6 前仅 MyISAM 支持)。
- 存储格式简单,占用空间小,备份恢复方便。
- Memory(HEAP)(灭摸瑞)
- 数据 全部存储在内存中,读写速度极快(适用于临时数据)。
- 支持 哈希索引(查询速度快,但不支持范围查询)和 B 树索引。
- 不支持事务、外键,表级锁。
- 数据在 MySQL 服务重启或崩溃后丢失(内存易失性)。
- Archive(哦凯服)
- 专为 数据归档 设计,压缩比极高(节省存储空间)。
- 只支持 INSERT 和 SELECT 操作,不支持 UPDATE、DELETE、索引(除自增主键)。
- 行级锁,适合批量插入。
<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
特性 | InnoDB | MyISAM | Memory | Archive |
事务支持 | ✅ | ❌ | ❌ | ❌ |
外键支持 | ✅ | ❌ | ❌ | ❌ |
锁粒度 | 行级锁 | 表级锁 | 表级锁 | 行级锁 |
索引类型 | B-Tree(聚簇) | B-Tree(非聚簇) | 哈希 / B-Tree | B-Tree |
数据存储 | 磁盘 | 磁盘 | 内存 | 磁盘(压缩) |
崩溃恢复 | ✅ | ❌ | ❌ | ❌ |
适用场景 | 事务、高并发 | 只读、全文搜索 | 临时数据、高速查询 | 历史归档 |
Q:数据库的三范式
- 第一范式(1NF):属性不可拆分(列)
- 第二范式(2NF):在满足第一范式的情况下,不能存在部分依赖,既非主键属性必须完全依赖于主键,不能依赖部分主键
- 第三范式(3NF):在满足第二范式的情况下,不能出现依赖传递,例如:C(非主属性)-->B(非主属性)-->A(主属性)
1NF的情况:
在需求分析后,contact(属性)可拆分成电话号码和地址俩列,不满足1NF条件
<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
id | name | sex_code | sex_desc | contact |
1 | 张三 | 0 | 男 | 17835201234_山西省运城市xx村 |
2 | 李四 | 0 | 男 | 17735204567_山西省吕梁市yy村 |
3 | 王五 | 1 | 女 | 18835207890_山西省太原市zz村 |
2NF的情况:
kc_name依赖于kc_id而不依赖于stu_id,此时的kc_id和stu_id属于联合主键,所以不满足2NF的情况
<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
stu_id | kc_id | score | kc_name |
1 | 1011 | 85 | 高数3-1 |
1 | 1022 | 79 | 计算机组成原理 |
2 | 1011 | 59.9 | 高数3-1 |
3NF的情况:
sex_desc依赖于sex_code,而sex_code依赖于id,这出现了依赖传递,不符合3NF
<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
id | name | sex_code | sex_desc | phone | address |
1 | 张三 | 0 | 男 | 17835201234 | 山西省运城市xx村 |
2 | 李四 | 0 | 男 | 17735204567 | 山西省吕梁市yy村 |
3 | 王五 | 1 | 女 | 18835207890 | 山西省太原市zz村 |