1. 什么是关系型数据库

存储了数据之间的联系

2. MySQL 优点

社区，成熟，开源免费，事务分库分表功能完善

3. MySQL 字段类型

- **数值类型**：
- **字符串类型**：
- **日期事件类型 **：
![[Pasted image 20230810104944.png]]

4. char 和 varchar 的区别

char 是定长，长度不可变，占用长度固定，空白处填充空格，varchar 长度可变，但是需要额外 1 个或两个记录长度

5. decimal 和 float/double 的区别

decimal 是定点数，可存储精确小数位，float 是浮点数，只能存储近似精度的

6. 为什么不推荐 text 和 blob

text 可存储不限长度的数据，blob 存储二进制对象，
都不能有默认值，text 检索效率低，需要指定前缀长度，影响 IO 带宽

7. datetime 和 timestamp 的区别

datetime 没有时区信息，占 8 个字节，timestamp 与时区有关，占 4 个字节

8. NULL 和‘’的区别

NULL 代表一个不确定的值，都是 NULL 也不一定相等，聚合函数会忽略 NULL 值
‘’长度为 0，不占用空间，NULL 占空间，需要用 IS NULL 或 IS NOT NULL 判断

9. 基础架构/查询过程

- 连接器
- 查询缓存
- 分析器
- 优化器
- 执行器
- 插件式存储引擎

10. 支持的存储引擎，默认使用哪个

InnoDB 式默认存储引擎，只有 InnoDB 支持事务

11. 存储引擎架构

插件式架构，存储引擎基于表，而不是数据库

12. MyISAM 和 InnoDB 区别，如何选择

MyISAM 不支持事务和行级锁，崩溃后无法安全恢复，不支持外键，不支持 MMVC，索引与数据分离

13. [[MySQL索引]]

14. 查询缓存

查询时会先查询缓存，在同样的查询条件和数据情况下，会直接命中缓存返回结果
**不命中情况**：
- 查询在任何字符上的不同
- 查询中包含用户自定义函数，存储函数，用户变量，临时表，MySQL 中的系统表
- 如果这个表的数据发生变化

15. 日志

1. MySQL 中的常见日志有哪些
	
 1. 慢查询日志有什么用
 2. binlog 主要记录了什么
 3. redolog 如何保证事务的持久性
 4. 页修改之后为什么不直接刷盘
 5. binlog 和 redolog 有什么区别
 6. undolog 如何保证事务的原子性

16. 事务

	 1. 什么是事务

		逻辑上的一组操作，要么都执行，要么都不执行

	 1. 数据库事务

		要么全部执行成功，要么全部不执行
		- 原子性
		- 一致性
		- 隔离性
		- 持久性

	 1. 并发事务带来的问题

	- 脏读
	- 丢失修改
	- 不可重复读
	- 幻读

	 1. 不可重复读和幻读的区别

		不可重复读是多次读取数据值被修改
		幻读，可以看作是不可重复读的特殊情况，查询记录条数不一致

	 1. 并发事务的控制方式

	- 锁 
		通过读写锁来实现并发控制
	- [[MVCC]]
		多版本并发控制，对一份数据存储多个变笨，通过事务的可见性办证事务看到自己该刊的版本，主要依赖手段：隐藏字段，read view，undo log

	 1. 事务隔离级别

	- 读未提交
	- 读已提交
	- 可重复读
	- 可串行化

	 1. MySQL 隔离级别基于锁实行的吗

		SERIALZABLE 是通过锁。READ-COMMIT 和 REPEATABLE-READ 通过 MVCC 实现

	 1. 默认隔离级别

		可重复读

17. MySQL 锁

	1. 表锁和行锁

		表锁是粒度最大的锁，针对非索引字段加的锁，简单，资源消耗小，不会死锁
		行锁，粒度最小的锁，针对索引字段加的锁，减少数据库操作的冲突，开销大，枷锁慢，会死锁

	1. 行级锁的使用

		执行更新的语句时，WHERE 条件中没有命中唯一索引或索引失效会导致表锁

	1. InnoDB 有哪几类行锁

	- 记录锁：单个行记录上的锁
	- 间隙锁：锁定一个范围，不包括记录本身
	- 临键锁：记录锁+间隙锁，解决幻读问题

		默认使用临键锁，操作的索引是唯一索引或主键会降级为记录锁

	1. 共享锁和排他锁

	- 共享锁
	- 排他锁
		因为 MVCC，一般 SELECT 语句不会加锁，通过 LOCK IN SHARE MODE 和 FOR SHARE 或 FOR UPDATE 加锁

	1. 意向锁的作用

		通过意向锁快速判断是否可以对某个表使用表锁
		- 意向共享锁
		- 意向排他锁
		意向锁是数据引擎自己维护的，意向锁之间兼容，意向锁和共享锁和排他锁互斥

	1. 当前读和快照读的区别

		快照读是单纯的 select 语句，不包括加锁的语句，不会等待记录上的锁释放而是读取行的一个快照
		当前读就是给记录加锁

	1. 自增锁

		插入有自增列的表时，会先获取自增锁，拿不到会阻塞

8. 性能优化

	 1. 能直接存储文件吗

		可以但是不建议

	 1. 如何存储 IP 地址

		将 IP 转为整型
		`INET_ATON()`：将 ip 转为无符号整型
		`INET_NTOA()`：把整型的 ip 转为地址

	 1. 常见 SQL 优化手段



	 1. 分析 SQL 的性能

		使用 `EXPLAIN` 命令区分析 [[SQL 执行计划]]

	 1. 读写分离



	 1. 分库分表



9. redolog 和 undolog

10. 两阶段提交（redo 和 binlog 一致性）

11. binlog 作用

12. 异步复制和同步复制