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. 异步复制和同步复制