《面试心经》---MySQL基础

一叶障目,不见Offer

前言

MySQL 是当今后端技术的世界必不可少的一部分。几乎所有的后端技术面试官都会围绕 MySQL 的原理和使用对面试者进行全方位、无死角的盘问。来自 MySQL 的盘问或许会迟到,但它绝不会缺席。看着一个个自信的小眼神被面试官折磨的黯淡无光,老衲实属不忍。在一个月黑风高的夜晚,终于下定决心,收集整理 MySQL 面试资料,著《面试心经》系列,望能普渡众生。

注:本篇问答基于 MySQL 8.0

面试开始

一个穿着邋里邋遢的秃顶中年人抱着一个满是划痕的Mac向你走来。看着那稀疏的头发,心想我艹,这至少也是个高级架构师了吧。但是看过《面试心经》的我们,依然可以气定神闲、稳如泰山

在这里插入图片描述

小伙子你好,看你简历上写了项目中有使用MySQL,请用一句话总结一下MySQL是什么?

这时的你心里忍不住暗骂,头都秃成这样了,问的问题如此平常,就这?但是你不能表现出来。

认真回答道:MySQL是一个关系型的数据库管理系统,由Oracle Corporation开发和维护

面试官头也不抬,接着提问:

MySQL 索引是什么?有什么用?

索引(Index)是一种数据结构,可以帮助MySQL高效获取数据

这个很好理解,假如 MySQL 是一本书,里面的一篇篇文章就好比一条条数据,索引就是书的目录,你若想阅读书中的某一篇文章,你可以先翻开目录,找到文章的页码,然后直接翻到相应的页码进行阅读。但是,如果没有目录,你就得从第一页开始,一页一页的往后找,一直找到你想要的那篇文章才终止查找,进行阅读。(如果你想阅读的文章恰好在书的最后一页,那你就得查找整本书,效率可想而知)

小伙子,那你知道 MySQL 索引有哪几种吗 ?

一气呵成的回答道:常见的索引有四种,分别是:PRIMARY KEY(主键索引),UNIQUE(唯一索引),INDEX(普通索引)和 FULLTEXT(全文索引),这几种都是使用 B树 实现的

最好还能简单介绍一下这几种索引的区别

注:B+树是B树的一种

如果你想要突出自己,你还可以说:另外,还有使用 R树 实现的 空间数据类型的索引 ,MEMORY 表还支持 哈希索引

如果你还想让人觉得你骨骼精奇,你可以说:除此之外,MySQL还支持 多列索引、 Invisible Indexes(不可见索引)、 Descending Indexes(降序索引)

面试官缓缓抬起头,只见他双眼微眯,继续发问:

你刚才提到 B树,那你说说 B树 平衡二叉树 有什么区别?为什么不用 平衡二叉树 实现索引呢

答:平衡二叉树是一种左右树高度 ≤ 1 的二叉树,B树是多叉树。由于B树每个节点可以存多个元素,所以相同数据量情况下,B树的树高往往要 小于 二叉树的树高,数据检索的速度更快

注:数据检索总是从根节点开始,树的高度 = 磁盘I/O的次数

使用和创建 多列索引(又称:复合索引)时需要注意什么?

风轻云淡道:最左原则

最左原则:举例来说,如果你有一个三列的索引(col1, col2, col3),则在搜索条件是(col1),(col1, col2) 或 (col1, col2, col3)的时候,都可以走索引查询

索引下推是什么?

答:索引下推是数据库检索数据过程中为减少回表次数而做的优化

MySQL 事务了解吗?说说它有哪些特征

注:InnoDB支持事务,MyISAM不支持

不假思索,道:ACID,分别是 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

面试官继续追问:MySQL 事务有几种隔离级别呢?

四种,级别从低到高分别是:读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)、串行化(Serializable)

注:MySQL的默认隔离级别是 可重复读(repeatable read)

分别解释一下脏读、不可重复读、幻读

这时你肯定暗自窃喜:“小样儿,不怕你问,就怕你不问。老夫早就准备好了”

脏读 是指一个事务读取到另一个事务修改后还没有 COMMIT 的数据;不可重复读 是指一个事务多次读取同一数据,在多次读取之间有另外的事务对这一数据进行修改并 COMMIT,导致多次读取同一数据的结果不一致;幻读 和不可重复读类似,区别在于不可重复读的重点是修改,幻读的重点在于新增或者删除

MySQL 的存储引擎有哪些?

答:常用的有 InnoDB、MyISAM。另外还有 MEMORY、CSV、ARCHIVE等

那你说说 InnoDB 和 MyISAM 的区别

InnoDB支持事务,MyISAM不支持
InnoDB支持外键,MyISAM不支持
InnoDB是聚簇索引 ,MyISAM是非聚簇索引。(聚簇索引 ≠ 主键)
MyISAM保存表总行数,InnoDB 不保存
InnoDB最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁

面试官微微颔首,继续道:

你刚提到聚簇索引,它是怎么回事儿

每个InnoDB表都有一个特殊的索引,称为 聚簇索引 ,用于存储行数据。通常,聚簇索引 就是 主键索引;如果没有为表定义主键,则会选择一个 NOT NULL 的 唯一索引(UNIQUE ) 作为聚簇索引;如果符合条件的 UNIQUE 也没有,则在InnoDB 内部生成一个隐藏的聚集索引 GEN_CLUST_INDEX

注:通常我们会为每个InnoDB表创建或选择一个 连续自增的列 作为主键(如自增 id),但是严格来讲,主键并不是必须的**

VARCHAR(10) 和 CHAR(10) 有什么区别

答:VARCHAR(10) 和 CHAR(10) 都代表字段最多可存储10个 字符(注:这里不是字节),但它们被存储和检索的方式不同。它们的最大长度以及是否保留尾随空格也不同。
在这里插入图片描述

CHAR 列的长度可以是 0 到 255 之间的任何值。CHAR 存储值时,MySQL会用空格右填充到指定的长度。当检索CHAR列的值时,尾部填充的空格会被丢弃(如果你的数据本身尾部有空格,也会一并丢弃)。
VARCHAR 列存储可变长度的字符串,最多可以存储 65535 bytes(字符集不同,一个字符所占的bytes可能不同),如果存储的数据没有达到指定的长度,并不会用空格填充。另外,VARCHAR列存储数据时,采用前缀 + 数据。前缀占 1 byte 或者 2 bytes(申明时字节数 ≤ 255,则前缀占用 1 byte ,如varchar(255)。否则前缀占用 2 bytes),前缀用于保存该数据长度

如果我往 CHAR(2)列上设置值 ‘abcde’ 会怎样?

可故作思考,答:分两种情况,如果SQL模式设置为严格,不会存储值,并抛出错误。如果SQL模式设置不为严格,则会将值截断存储,并抛出警告,例如这里会存储 ‘ab’

MySQL主从有了解吗?简要说明一下主从同步过程

主从同步的原理其实就是 基于二进制文件的复制,分为 同源复制 (一主多从或一主一从)多源复制(多主多从),这里以常用的一主多从为例

略微组织一下语言,娓娓道来:Master 将所有对数据的操作命令(增、删、改)写入binlog文件,Slave 去读取 Master 的 binlog文件,然后执行。

如果有需要,你还可以稍微说详细一点,主从复制具体步骤如下:

前置:Master 和每个 Slave 都已配置唯一的服务器 ID(使用server_id系统变量),Master 开启 binlog

  1. Master:binlog线程——将所有对数据的操作命令(增、删、改)写入 binlog 文件
  2. Slave:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的 relay log 中;(每个Slave都会记录上一次读取的位置,所以下一次可以接着读。这也意味着可以将多个Slave连接到Master并执行同一二进制日志的不同部分)
  3. Slave:sql执行线程——执行 relay log 中的语句(可以将Slave配置为仅处理操作特定数据库或表的事件)

面试官两眼放光,嗯,这盘是捡到宝了

面试结束

小伙子挺不错啊,这快到饭点儿了,要不咱们先去楼下餐厅边吃边聊吧。对了,你喜欢吃什么?

微笑着说:荣幸之至

这可是不可多得的好机会,如果有幸遇到这种情况,大概率能够说明面试官非常认可你了,可以趁吃饭的功夫了解一下公司的情况,也可以聊聊公司的技术栈以及兴趣爱好,拉近彼此的距离。再不济,也可以填饱肚子…

写在最后

不知你会不会有那样一种感觉,很多事情看起来很简单,觉得自己也能做,只是懒得去做而已;很多知识点看起来自己都知道,但当面试官问的时候,你却不能逻辑清晰且完整的做出回答,事后还觉得:这些自己都会,只是发挥不好而已….

我以前也是这样。但我现在才明白,其实不是懒,只是不愿意承认自己是个废物而已。

Stay hungry, stay foolish
努力提升自己技术的看度和广度,是通过面试的必要条件
平时多思考、多总结,才能在面试时侃侃而谈
另外保持自信和从容,会让你看起来更加靠谱,提升面试通过率

本文是根据平时面试的经历,总结完善而成。由于篇幅原因,有一些回答或许不够完美,我会在之后的文章中将面试时的常考点更加细致的剖析。

用最朴素的语言,装最高端的B

最后,祝大家早日上岸。咱们的口号是: 必拿下!!!

你的 点赞 和 关注 对我非常有用

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

好文章,收藏了
弱弱的问一句,吃饭的话谁付钱

3年前 评论
想出家的霸天虎 (楼主) 3年前
liuqiang_007 3年前
cky (作者) 3年前
liuqiang_007 3年前
AKA-TanNaWen 3年前

看你着那稀疏的头发 应该是 “你看着” 把,差点以为自己也是个大佬

3年前 评论
想出家的霸天虎 (楼主) 3年前

@cky 我特么一耳巴子~

3年前 评论

MySQL 锁相关的知识,也可以补充进去。

3年前 评论
想出家的霸天虎 (楼主) 3年前
3年前 评论
想出家的霸天虎 (楼主) 3年前

反手就是一个👍

3年前 评论

就怕面试官不按套路出牌

3年前 评论

看到标题,就想到了 玉女心经 :joy:

3年前 评论
想出家的霸天虎 (楼主) 3年前
playmaker

lj

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!