35道MySQL面试必问题图解,这样也太好理解了吧

关于面试题的文章之前发过不少,但读者们给的反馈是普遍是理解难,看完就忘。所以今天我会用画图来给大家分析一下这35道题,希望能够加深你们的理解。

篇幅所限,本文先写MySQL的35问,其他的技术栈我也都整理好了,后面会持续更新,点个关注不迷路[看]

当然我知道肯定有等不及的同学,所以我会把整理好的文档都无偿分享出来,如图

领取传送门

好了,那废话不多说,我们一起来揭开这35道题的神秘面纱

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 为主键索引

update T set c=c+1 where id=2;
  • 1.执行器先找引擎取 id=2 这一行。id 是主键,引擎直接用树搜索找到这一行
    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    北游学Java

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值