C# .NET CORE 面试题【Mysql篇】
心之所向,勇往直前!
简单归纳Mysql相关面试题
正文
MySql的索引有哪些?
a. 聚簇索引:主键,索引即数据
b. 非聚簇索引:索引和数据分开储存,检索到索引后需要回表查询数据
MySql的MylSAM和Innodb有什么区别?
a. MylSAM不支持事务,Innodb支持事务
b. MylSAM支持表锁,Innodb支持行锁
c. MylSAM将数据文件和索引文件分开存储(B树),InnoDB将索引和数据存储在一起(B+树)
d. MylSAM通常比InnoDB快,尤其是在读取密集型的应用场景下,InnoDB在写入密集型应用中可能表现更好,因为它有更好的并发控制
e. MyISAM不支持外键,InnoDB支持外键
MySql有一个联合索引a,b,c,where条件为a,c能否走上该索引?
a. 可以走上索引(会先检索到a)
b. 基于最左匹配原则(最左优先,以最左边的为起点任何连续的索引都能匹配上,同时遇到范围查询(>、<、between、like)就会停止匹配,排列组合中的顺序会被优化器优化)
c. 如果a、c列查询比较频繁,单独建立索引会更好
MySql的Innodb通过什么保证ACID?
a. 原子性(Atomicity):通过undolog来保证事务的原子性,事务中的操作全部成功或者全部失败。undolog记录了事务中每一步操作的反向操作,如果事务需要回滚,InnoDB会通过这些日志将数据恢复到事务开始前的状态
b. 一致性(Consistency):InnoDB通过原子性、持久性、隔离性最终实现数据一致
c. 隔离性(Isolation):InnoDB通过MVCC和锁机制保证隔离性
d. 持久性(Durability):通过redolog来保证事务的持久性
可以详细说说undolog吗?
a. undolog记录了执行语句的反向语句,用于事务回滚
b. undolog是逻辑日志,InnoDB存储引擎回滚时,对于每个INSERT,会完成一个DELETE;对于每个DELETE,会执行一个INSERT;对于每个UPDATE,会执行一个相反的UPDATE,将修改前的行放回去
c. undolog也用于MVCC,当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取
可以详细说说redolog吗?
a. redolog用于保证事务的持久性(Innodb是通以页为单位来写磁盘IO的,同一个事务又可能涉及多个不连续页,每次都直接刷盘会损耗极大的性能,而且一旦发生宕机则会丢失数据)
b. redolog记录存储表空间ID、页号、偏移量和需要更新的值
c.事务执行时会先把命令记录到redolog的buffer pool中,再以一定频率将数据刷到redo log file中
可以详细说说binlog吗?
a. binlog是二进制日志文件,记录了所有更新数据库的语句
b. binlog可以用于恢复数据、数据备份、集群、读写分离
c. binlog在事务提交时写入
Innodb如何解决redolog和binlog两种日志的逻辑一致问题?
a. Innodb采用两段提交的方式解决这种问题(两阶段提交:将redo log的写入操作拆成了两个步骤prepare和commit进行,在事务执行期间,写入的redo log标记为prepare阶段,待事务提交且bin log写入成功时,才将redo log标记为commit阶段。)
Mysql的四种事务隔离级别是什么?
a. 读未提交(Read Uncommitted):在这个级别下,一个事务可以读取另一个事务中还未提交的数据
b. 读已提交(Read Committed):
c. 不可重复读(Repeatable Read):
d. 串行读(Serializable):
| 隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
|---|---|---|---|---|
| READ UNCOMMITTED | 是 | 是 | 是 | 否 |
| READ COMMITTED | 否 | 是 | 是 | 否 |
| REPEATABLE READ | 否 | 否 | 是 | 否 |
| SERIALIZABLE | 否 | 否 | 否 | 是 |
结语
本篇到此结束,如果有任何疑问或者指正,请发表在评论区。

浙公网安备 33010602011771号