近期去Mysql大厂面试,发现对Mysql要求比较高,其中对Mysql相关的问题会狂轰乱炸,如果你在找工作时,发现有以下技能要求,如果不想被面试官疯狂Diss,就要做好充足的准备了。
还好平时积累比较足,此轮技术面顺利通过。
由于每个Java程序员,都绕不过学习、使用RDBMS这道坎。
这里我想着重和大家分享一下我在面试中与MySQL有关的一些问题,希望能对大家有所帮助。
1. name字段建立索引,where name like ‘dafei%’一定会用到索引么?
不一定,要根据数据的离散性来确定。比如说:如果相关表的数据是dafei1,dafei2,dafei3.....dafein,那么它肯定不会用到索引,因为此时数据的离散性很差。相反的,如果数据库中的数据是jack,dafei,king,lison等,是会用到索引的,具体要根据数据的分布情况和执行计划来进行分析。
2.为什么MySQL要默认使用B+Tree,而不是B-Tree,AVL?
1、B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。
4、B+Tree在叶子节点,存放数据区,是天然有序的,一个节点末尾关键字,会指向相邻节点的头关键字,它更加方便排序。
3. 为什么不建议写select * from 进行查询?
这里要结合覆盖索引去理解,如果是select id,name from user where name='dafei',如果此时user表建立了name索引,会触发覆盖索引,不会进行回表操作,能够增加查询速度。
4. 为什么建议主键ID是递增的,和B+Tree有什么关联?
最左匹配原则可以结合联合索引去理解,如果有一个3列索引(name,phonenum,age),则已经对(name)、(name,phonenum)、(name,phonenum,age)上建立了索引。
b+树的数据项是复合的数据结构,比如建立了(name,phoneNum,age)联合索引的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(大飞,13312343333,18)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较phoneNum和age,最后得到检索的数据;但当(phoneNum,age)这样的没有name的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。
再比如当通过(name,age)=('dafei',18)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段phoneNum的缺失,所以只能把名字等于dafei的数据都找到,然后再匹配age的数据了, 这个是非常重要的性质,即索引的最左匹配特性。
5. 为什么建议主键ID是递增的,和B+Tree有什么关联?
B+Tree的叶子节点的数据区是天然有序的,一个节点末尾关键字,会指向相邻节点的头关键字。当新增数据时,如果数据是递增的,只会进行尾插,相反,如果数据是随机的,可能会触发页的分裂和合并。
以上是我此次面试被问到的有关MySQL的知识点,除此之外,以下问题在一线大厂也属于MySQL的高频面试问题。
由于篇幅有限,以下问题的答案我就不一一展现了。如果有需要,可以直接私信我,回复 “面试” 希望分享出来对大家有所帮助。
6. Innodb如何解决幻读?
7. 怎么判断索引索引是否充分被使用
8. 执行计划的type列常见的值有哪些
9. MySQL有哪些存储引擎啊?都有什么区别?
10.你是如何理解三星索引的?
11.and和or是如何利用索引的?
12.请简单描述下MRR 和 ICP,这几个可以写答案
13.Char死锁及监控是什么?
14.Varchar、Varbinary存储字符的区别?
15.查询优化的基本思路是什么
16.Innodb如何解决幻读?
17.表结构对性能有什么影响?
18.怎么判断索引索引是否充分被使用
19..执行计划的type列常见的值有哪些
20.MySQL有哪些存储引擎啊?都有什么区别?
21.Mysql如何优化DISTINCT?
22.如何输入字符为十六进制数字?
虽然近期因为疫情原因,整个大环境不太景气,但是机会只会垂青有准备的人,希望以上的知识点能对大家有所帮助,与诸位共勉,peace~~
网友评论