一文打尽MySQL面试经典35

白癜风青少年援助 http://www.bdfyy999.com/Photo/zhongkerongyu/938.html

大家好,我是Tom哥

今天给大家总结了35个Mysql常见的小问题

1.说一说三大范式

2.MyISAM与InnoDB的区别是什么?

3.为什么推荐使用自增id作为主键?

4.一条查询语句是怎么执行的?

5.使用Innodb的情况下,一条更新语句是怎么执行的?

6.Innodb事务为什么要两阶段提交?

7.什么是索引?

8.索引失效的场景有哪些?

9.为什么采用B+树,而不是B-树

10.WAl是什么?有什么好处?

11.什么是回表?

12.什么是索引下推?

13.什么是覆盖索引?

14.什么是最左前缀原则?

15.普通索引和唯一索引该怎么选择?

16.什么是事务?其特性是什么?

17.事务的隔离级别?

18.binlog是做什么的?

19.undolog是做什么的?

20.relaylog是做什么的?

21.redolog是做什么的?

22.redolog是怎么记录日志的?

23.redolog和binlog的区别是什么?

24.说一说mvcc吧,有什么作用?

25.一条Sql语句查询一直慢会是什么原因?

26.一条Sql语句查询偶尔慢会是什么原因?

27.Mysql主从之间是怎么同步数据的?

28.主从延迟要怎么解决?

29.删除表数据后表的大小却没有变动,这是为什么?

30.为什么VarChar建议不要超过?

31.分布式式事务怎么实现?

32.Mysql中有哪些锁?

33.为什么不要使用长事务?

34.bufferpool是做什么的?

35.说说你的Sql调优思路吧

1.说一说三大范式

「第一范式」:数据库中的字段具有「原子性」,不可再分,并且是单一职责

「第二范式」:「建立在第一范式的基础上」,第二范式要求数据库表中的每个实例或行必须「可以被惟一地区分」。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键

「第三范式」:「建立在第一,第二范式的基础上」,确保每列都和主键列直接相关,而不是间接相关不存在其他表的非主键信息

但是在我们的日常开发当中,「并不是所有的表一定要满足三大范式」,有时候冗余几个字段可以少关联几张表,带来的查询效率的提升有可能是质变的

2.MyISAM与InnoDB的区别是什么?「InnoDB支持事务,MyISAM不支持」。「InnoDB支持外键,而MyISAM不支持」。「InnoDB是聚集索引」,使用B+Tree作为索引结构,数据文件是和索引绑在一起的,必须要有主键。「MyISAM是非聚集索引」,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。「InnoDB不保存表的具体行数」。「MyISAM用一个变量保存了整个表的行数」。

5.Innodb有「redolog」日志文件,MyISAM没有

6.「Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI」

Innodb:frm是表定义文件,ibd是数据文件Myisam:frm是表定义文件,myd是数据文件,myi是索引文件「InnoDB支持表、行锁,而MyISAM支持表级锁」

8、「InnoDB必须有唯一索引(主键)」,如果没有指定的话InnoDB会自己生成一个隐藏列Row_id来充当默认主键,「MyISAM可以没有」

3.为什么推荐使用自增id作为主键?1.普通索引的B+树上存放的是主键索引的值,如果该值较大,会「导致普通索引的存储空间较大」2.使用自增id做主键索引新插入数据只要放在该页的最尾端就可以,直接「按照顺序插入」,不用刻意维护3.页分裂容易维护,当插入数据的当前页快满时,会发生页分裂的现象,如果主键索引不为自增id,那么数据就可能从页的中间插入,页的数据会频繁的变动,「导致页分裂维护成本较高」4.一条查询语句是怎么执行的?1.通过连接器跟客户端「建立连接」2.通过查询「缓存查询」之前是否有查询过该sql有则直接返回结果没有则执行第三步3.通过分析器「分析该sql的语义」是否正确,包括格式,表等等4.通过优化器「优化该语句」,比如选择索引,join表的连接顺序5.「验证权限」,验证是否有该表的查询权限没有则返回无权限的错误有则执行第六步6.通过执行器调用存储引擎执行该sql,然后返回「执行结果」5.使用Innodb的情况下,一条更新语句是怎么执行的?

用以下语句来举例,c字段无索引,id为主键索引

updateTsetc=c+1whereid=2;

1.执行器先找引擎取id=2这一行。id是主键,引擎直接用树搜索找到这一行

如果id=2这一行所在的数据页本来就「在内存中」,就「直接返回」给执行器「不在内存」中,需要先从磁盘「读入内存」,然后再「返回」

2.执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N+1,得到新的一行数据,再调用引擎接口「写入这行新数据」

3.引擎将这行新数据更新到内存中,同时将这个更新操作「记录到redolog里面」,此时redolog处于「prepare」状态。然后告知执行器执行完成了,随时可以提交事务

4.执行器「生成这个操作的binlog」,并把binlog「写入磁盘」

5.执行器调用引擎的「提交事务」接口,引擎把刚刚写入的redolog改成提交(


转载请注明:http://www.aierlanlan.com/cyrz/482.html