MySQL常见面试题汇总

本文汇总了MySQL面试中常见的问题,包括存储引擎的区别、InnoDB索引、行锁与表锁、事务特性、索引优化、MVCC原理、MySQL与Redis的适用场景等,旨在帮助你准备MySQL面试。
摘要由CSDN通过智能技术生成

目录

1、mysql的存储引擎?有什么区别?优点,缺点,什么场景是用什么?

2、innodb是什么索引?为什么查主键索引会比较快?

3、说一下 mysql 的行锁和表锁?

4、事务是什么?mysql事务的特性?ACID?MySQL并发事务带来的问题?事务隔离级别?mysql默认隔离级别?

5、数据库事务的实现原理?

6、怎么验证 mysql 的索引是否满足需求?

7、 说一下乐观锁和悲观锁?

8、mysql 问题排查都有哪些手段?

9、如何做 mysql 的性能优化?

10、索引是什么?  分类?  作用?  索引失效? 失效原理?(最左前缀)

11.MVCC是什么?MVCC的实现原理?

12.mysql 和 redis的适应场景

13.MySQL性能分析Explain(执行计划)?

14.覆盖索引(索引覆盖)?

15.索引优化(即如何防止索引失效)?

16.解决like'%字符串%' 索引失效的方法?

18.为什么要分库分表?(待补充)

19.b+树?

20.聚簇索引与非聚簇索引?

21.mysql中in和exists区别?

1、mysql的存储引擎?有什么区别?优点,缺点,什么场景是用什么?

 答:MyISAM和InnoDB,InnoDB是mysql5.5及之后默认使用的存储引擎。InnoDB支持事务、外键,MyISAM不支持。MyISAM只缓存索引,不缓存真实数据。而InnoDB不仅缓存索引还要缓存真实数据。MyISAM不适合高并发的操作,因为它是表锁,操作一行记录会锁住整张表,而InnoDB是行锁,写操作是不会锁定全表的,适合并发度较高的场景。MyISAM当进行 select count(*) from table 语句时,不需要进行全表扫描,因为它底层维护了一个计数器,提前将表的总行数存储起来,定期维护。而InnoDB需要进行全表扫描。如果表的读操作远远多于写操作时,并且不需要事务支持的,可以考虑用MyIASM。

InnoDB是聚簇索引,数据文件和索引文件是绑在一起的。MyISAM是非聚簇索引,索引文件与数据文件是分离的。InnoDB的B+树主键索引的叶子节点存放的就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。

2、innodb是什么索引?为什么查主键索引会比较快?

 答:innodb是聚簇索引。因为innodb的主键索引与数据文件是绑在一起的,而辅助索引的话就得需要两次查询才能找到数据,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键过大的话,索引也会变大。

3、说一下 mysql 的行锁和表锁?

 答:MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。表级锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率最高,并发量最低。行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度最高。

4、事务是什么?mysql事务的特性?ACID?MySQL并发事务带来的问题?事务隔离级别?mysql默认隔离级别?

 答:事务是SQL语句被当做一个整体,要么都执行成功,要么都执行失败。四大特性。原子性、一致性、隔离性、持久性。原子性指的是一个事务里的命令要么全部执行,要么全部不执行,如果中间发生了错误,会导致前面的命令回滚,后面的命令不再执行。一致性指执行事务前后,数据保持一致。例如银行转账,不管转账成功与否,转账前后总额是不变的。隔离性指的是一个事务执行不会影响另一个事务的执行。持久性指的是事务完成之后,对数据库所做的更改将持久地保存在数据库中,并不会被回滚。并发事务带来的问题有脏读、丢失更新、不可重复读、幻读。脏读指的是一个事务对数据进行了修改还没有提交到数据库中,若此时另一个事务前来查询这条数据,查到的就是未提交的数据,即”脏数据“,如果刚才那条数据回滚了,则查询到的数据是无效的。不可重复读是指一个事务内两次读到的数据是不一样的情况,由于另一个事务对数据进行了修改并提交,导致第二次读到的数据不一致的情况。幻读的重点在于新增或者删除,第一个事务刚开始读取到几行数据,第二个事务进行了删除或修改后,第一个事务再去读取就会发现多了或少了几行数据,就像发生了幻觉一样。丢失更新指的是当两个或多个事务修改同一行,由于不知道其它事务的存在,最后的更新覆盖了其他事务所做的更新,导致更新丢失。mysql默认隔离级别有读未提交、读已提交、可重复读、串行化。默认隔离级别是可重复读。

5、数据库事务的实现原理?

 答:以 MySQL 的 InnoDB 引擎为例来简单说一下。MySQL InnoDB 引擎使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证事务的原子性。MySQL InnoDB 引擎通过锁机制、MVCC等手段来保证事务的隔离性(默认支持的隔离级别是 REPEATABLE-READ)。保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。

原子性实现:是用undolog实现的,undolog的意思是回滚日志,指的是每次在有写命令的时候,会先向undolog中写入一份,如果中间发生了故障,就可以通过undolog进行回滚,比如说如果是insert命令只要delete就可以了,delete命令只要insert就可以了,update命令只要更新回原来的值就可以了。

持久性实现:是用redolog实现的,重做日志,mysql在读取或者修改数据的时候并不是直接进行读取修改的,而是用到了缓存的概念,因为如果每次读取修改都要对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值