Files
Hui-s-notebook/Java-Interview/数据库/MySQL.md
Lostecho c8f11d0488 update
2024-03-03 16:38:06 +08:00

203 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 viewundo 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. 异步复制和同步复制