作者:微信小助手
发布时间:2023-10-13T16:01:20
为了节省大家的时间,阿Q决定帮大家先将 MySQL 面试相关的知识进行汇总整理,一改往日知识点东一棒槌西一榔头的问题。那么,你准备好迎接 MySQL 连环炮了嘛? 1、三大范式 2、DML 语句和 DDL 语句区别 3、主键和外键的区别 4、drop、delete、truncate 区别 5、基础架构 6、MyISAM 和 InnoDB 有什么区别? 7、推荐自增id作为主键问题 8、为什么 MySQL 的自增主键不连续 9、redo log 是做什么的? 10、redo log 的刷盘时机 11、redo log 是怎么记录日志的 12、什么是 binlog 13、binlog 记录格式 14、binlog 写入机制 15、redolog 和 binlog 的区别是什么 16、两阶段提交 17、什么是 undo log. 18、什么是 relaylog 19、索引 20、Hash 索引 21、B树和B+ 树 22、主键索引 23、二级索引 24、聚簇索引与非聚簇索引 25、回表 26、覆盖索引和联合索引 27、最左前缀匹配原则 28、索引下推 29、隐式转换 30、普通索引和唯一索引该怎么选择? 31、避免索引失效 32、建立索引的规则 33、事务极其特性 34、并发事务带来的问题 35、事务的隔离级别 36、MVCC 37、Mysql 中的锁 38、查询语句执行过程 39、更新语句执行过程 40、sql 优化 41、主从同步数据 42、主从延迟要怎么解决 43、为什么不要使用长事务 1NF(第一范式):属性(对应于表中的字段)不能再被分割,也就是这个字段只能是一个值,不能再分为多个其他的字段了。1NF 是所有关系型数据库的最基本要求 ,也就是说关系型数据库中创建的表一定满足第一范式。 2NF(第二范式):2NF 要求数据库表中的每个实例或行必须可以被惟一地区分,2NF 在 1NF 的基础上增加了一个列,这个列称为主键,非主属性都依赖于主键。 3NF(第三范式):3NF 在 2NF 的基础之上,要求每列都和主键列直接相关,而不是间接相关,即不存在其他表的非主键信息。 在开发过程中,并不一定要满足三大范式,有时候为了提高查询效率,可以在表中冗余其他表的字段。 (1)用法不同 (2)属于不同的数据库语言 (3)执行速度不同 一般来说: 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到客户端的一条 SQL 语句在 MySQL 内部是如何执行的。 MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认存储引擎,MySQL 5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。 (1)是否支持行级锁 MyISAM 只有表级锁,而 InnoDB 支持行级锁和表级锁,默认为行级锁。 具体的锁详情请参考阿Q的此篇文章:面试必备常见存储引擎与锁的分类,请查收 (2)是否支持事务 MyISAM 不提供事务支持,InnoDB 提供事务支持,实现了 SQL 标准定义的四个隔离级别,具有提交和回滚事务的能力。 InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。 关于 MySQL 事务以及解决幻读的详细介绍,可以看看阿Q写的这篇文章:InnoDB 解决幻读的方案--LBCC&MVCC (3)是否支持外键 MyISAM 不支持,而 InnoDB 支持。 (4)是否支持数据库异常崩溃后的安全恢复 MyISAM 不支持,而 InnoDB 支持。使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 (5)是否支持 MVCC MyISAM 不支持,而 InnoDB 支持。 (6)索引实现 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。 (7)性能差别 InnoDB 的性能比 MyISAM 更强大,不管是在读写混合模式下还是只读模式下,随着 CPU 核数的增加,InnoDB 的读写能力呈线性增长。MyISAM 因为读写不能并发,它的处理能力跟核数没关系。 比如 更新表数据的时候,如果发现 InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略 innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用 fsync(同步操作) 对 redo log 进行刷盘。 另外 InnoDB 存储引擎有一个后台线程,每隔1秒,就会把 redo log buffer 中的内容写到文件系统缓存(page cache),然后调用 fsync 刷盘。 redo log buffer占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动刷盘。 硬盘上存储的 比如可以配置为一组 它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。 所以,如果数据写满了但是还没有来得及将数据真正的刷入磁盘当中,那么就会发生「内存抖动」现象,从肉眼的角度来观察会发现 mysql 会宕机一会儿,此时就是正在刷盘了。 binlog 是归档日志,属于 Server 层的日志,是一个二进制格式的文件,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”。 不管用什么存储引擎,只要发生了表数据更新,都会产生
1、三大范式
2、DML 语句和 DDL 语句区别
3、主键和外键的区别
4、drop、delete、truncate 区别
drop
(丢弃数据):
drop table 表名
,直接将表结构都删除掉,在删除表的时候使用。
truncate
(清空数据) :
truncate table 表名
,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
delete
(删除数据) :
delete from 表名 where 列名=值
,删除某一行的数据,如果不加
where
子句和
truncate table 表名
作用类似。
truncate
和
drop
属于 DDL(数据定义语言)语句,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
delete
语句是 DML (数据库操作语言)语句,这个操作会放到 rollback segment 中,事务提交之后才生效。
delete
命令执行的时候会产生数据库的
binlog
日志,而日志记录是需要消耗时间的,但是也有个好处方便数据回滚恢复。
truncate
命令执行的时候不会产生数据库日志,因此比
delete
要快。除此之外,还会把表的自增值重置和索引恢复到初始大小等。
drop
命令会把表占用的空间全部释放掉。
drop
> truncate
> delete
5、基础架构
6、MyISAM 和 InnoDB 有什么区别?
redo log
。
7、推荐自增id作为主键问题
8、为什么 MySQL 的自增主键不连续
9、redo log 是做什么的?
redo log
(重做日志)是InnoDB
存储引擎独有的,它让MySQL
拥有了崩溃恢复能力。MySQL
实例挂了或宕机了,重启时,InnoDB
存储引擎会使用redo log
恢复数据,保证数据的持久性与完整性。Buffer Pool
里存在要更新的数据,就直接在 Buffer Pool
里更新。然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer
)里,接着刷盘到 redo log
文件里。10、redo log 的刷盘时机
11、redo log 是怎么记录日志的
redo log
日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo
日志文件大小都是一样的。4
个文件,每个文件的大小是 1GB
,整个 redo log
日志文件组可以记录4G
的内容。
12、什么是 binlog