腾讯TEG AILab 一面二面HR 意向书
写在前面:楼主是22届校招生,十分幸运能被腾讯录取,感觉三个月的准备没有白费。后续会把自己的笔记放到Gitbook中给大家开源共享,祝大家秋招顺利!
一面 50min
项目问题 -15min
主要涵盖了我项目的开发流程,主要职责还有工作量。挖到一半发现我答的还可以就停了
我是个Javaer,但是面试官说他们是C++, 所以就没有问Java八股,直接从MySQL开始问了
MySQL问题
说说InnoDB与MyISAM的区别
- InnoDB 支持事务,MyISAM 不支持事务
- InnoDB 支持外键,而 MyISAM 不支持
- InnoDB 是聚簇索引,MyISAM 是非聚簇索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB必须要有主键,通过主键索引效率很高。
- InnoDB 最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞
- InnoDB 不保存表的具体行数,而MyISAM会保存,所以MyISAM在执行
select count(*)
更快
说说聚簇索引和非聚簇索引
提示点:再说非聚簇索引的时候一定要提到回表查询
为什么用B+树当索引的数据结构?它跟B树相比,优点是什么?
在B+Tree中,所有数据节点都是按照键值大小存放在同一层的叶子结点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度
所以与B树的不同在于
- 非叶子节点只存储键值信息;
- 所有叶子节点之间都有一个链指针;
- 数据记录都存放在叶子节点中
我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低
UNION和UNION ALL的区别?
UNION和UNION ALL都是将两个结果集合并为一个,两个要联合的SQL语句 字段个数必须一样,而且字段类型要一致;
- UNION在进行表连接后会筛选掉重复的数据记录(效率较低),而UNION ALL则不会去掉重复的数据记录;
- UNION会按照字段的顺序进行排序,而UNION ALL只是简单的将两个结果合并就返回;
Left Join 和Inner Join的区别
说说事务隔离级别
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
提到了幻读,从而引申出了MVCC
MVCC是怎么实现事务的安全性的
可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。大多数的MVCC都实现了非阻塞的读操作,写操作也只锁定必要的行。在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。
提到了行级锁后,说说锁按照粒度的分类
说完了后面试官提问:InnoDB行锁是怎么实现的?
我听到这里愣了得有二十秒,没想明白。然后面试官又提到了表锁,灵感就来了。InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
MySQL八股结束,开始写题
算法题:括号匹配,但是我用的栈必须得自己实现。算法写的挺快的,手动实现栈想了一下,解决了。
二面 1h
上来直接写题:三选一。我选了第一道
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
本来想用异或加位运算的,但是我这个算法不熟练。所以现场临时想了个类似于哈希的解法,就是数组中的值num对应的索引应该是num-1, 在操作完最后遍历的时候如果发现 这两个的值没有对应,那么它就是出现两次的元素
总得来说20分钟算是解决了,也写了测试语句通过了用例。
但是面试官好像没太看题,上来自己测试就往数组里加了个0,说我程序报错。给我吓一机灵,我提醒后,又往数组里加了个100,又说我报错哈哈,我没给他吓尿了。最后面试官嘟囔了句,这题限制还挺多,我只能应声附和。舔狗真是卑微..
写完之后继续项目,这次挖的比较彻底。从我们的市场调研开始说,动机是什么?每天的用户量有多少?数据库有多大?为什么用MySQL当数据库?为啥使用Mybatis Pagehelper? 怎么用Pagehelper? (现在还没有高并发的问题)-> 如果有高并发了怎么办?用什么解决?加什么东西?你觉得为什么可以?
这一套操作下来,面试官看我回答的还比较流利,就出了些分布式的场景题,具体问题有点忘了哈。大概是我上学期分布式数据库学过的算法往上套就行,但是我全还给老师了,只能现场硬说,跟阿杜一样--冷手硬打。有点痛苦
最后面试官说我们是C++哈,你Java可以转不?
那当然可以,必须可以,相当可以。我现场表忠心,“语言只是形式,关键还是思想,我自学能力很强的!”
面试结束以为自己凉了,结果当天晚上睡前就有TEG的HR姐姐加我微信了。我直接从书桌上起飞
HR面 30min
HR姐姐还是很温柔的
为啥要来腾讯?家是哪的?就是一些常规问题
然后又把我的项目唠了二十分钟
面完十分钟后云证加测评
周二HR面完 周五下午等来了Offer Call !!!!! 我也太开心了
以上就是我的流程,祝大家心想事成哈!
全部评论
(18) 回帖