203 lines
5.1 KiB
Markdown
203 lines
5.1 KiB
Markdown
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. 异步复制和同步复制 |