一叶障目,不见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
面试官两眼放光,嗯,这盘是捡到宝了
小伙子挺不错啊,这快到饭点儿了,要不咱们先去楼下餐厅边吃边聊吧。对了,你喜欢吃什么?
微笑着说:荣幸之至
这可是不可多得的好机会,如果有幸遇到这种情况,大概率能够说明面试官非常认可你了,可以趁吃饭的功夫了解一下公司的情况,也可以聊聊公司的技术栈以及兴趣爱好,拉近彼此的距离。再不济,也可以填饱肚子…
不知你会不会有那样一种感觉,很多事情看起来很简单,觉得自己也能做,只是懒得去做而已;很多知识点看起来自己都知道,但当面试官问的时候,你却不能逻辑清晰且完整的做出回答,事后还觉得:这些自己都会,只是发挥不好而已…
我以前也是这样。但我现在才明白,其实不是懒,只是不愿意承认自己是个废物而已。
Stay hungry, stay foolish
努力提升自己技术的看度和广度,是通过面试的必要条件
平时多思考、多总结,才能在面试时侃侃而谈
另外保持自信和从容,会让你看起来更加靠谱,提升面试通过率
本文是根据平时面试的经历,总结完善而成。由于篇幅原因,有一些回答或许不够完美,我会在之后的文章中将面试时的常考点更加细致的剖析。
用最朴素的语言,装最高端的B
最后,祝大家早日上岸。咱们的口号是: 必拿下!!!
你的 点赞 和 关注 对我非常有用