笔试:
选择题和不定项选择:题目应该是题库出的,设计java基础知识,servlet,框架和一些微服务、中间也能看到python的一些基础知识。
算法题 最长不重复子字符串。
很简单的双指针+Hash,时间复杂度O(n),空间复杂度O(n), AC.
技术面:
总结下来:个人感觉有一些些的怪异. 问了问个人背景(学校和以前学习的课程),然后没有问关于Java或者分布式的知识,直奔数据库提问。
流程如下:
1. 确认信息无误,做个基本的自我介绍
2. 之前有过MYSQL调优的经验吗,如何调的?
答:SQL调优分为两部分,可以通过数据库设计做,比如分库分表,也可以通过提升查询语句效率去做。以查询语句为例子:
比如在查询的时候使用小表驱动大表,Order by使用索引最左列;GroupBy优化,因为Group by是建立缓冲区在分组排序,遵守最左匹配原则否则会索引失效,产生临时表。
同时开启慢查询日志,把超过阈值的查询语句抓出来做explain,通过show profile来看SQL的具体执行细节和生命周期,根据这些数据尝试改进SQL.
3. 如果一个表的索引加在字段(a,b)上,而现在去对a,b,c三个字段进行查询,是否会走索引。
答:mysql会先通过a,b字段的索引进行查询,然后带着查询出来的数据行进行一次回表查询来匹配c.
问:那就是会走索引咯?
实际面试的时候这里紧张愣住了一下,其实上面答的是没错的,但是看着面试官不自信了:emmmmmm,如果是ab的话肯定是走索引的,abc的话它超出了索引范围没有实现覆盖,所以不走索引。
面试完了觉得自己犯傻了,坚持自己第一次的回答就好。
追问:如果是(a,b)字段只查询a呢?
当然走索引,并且作为第一字段查询会很快,索引全覆盖级别甚至不用回表,好的话能达到const.
追问:如果(a,b)字段只查询b呢?
不走索引的,很明显打破了最左匹配原则。因为mysql它的底层是一颗B+树,首先按照第一字段的大小进行排列,如果缺失了聚簇索引的第一字段,无法直接查询到后面的字段。
4. having知道吗,一般和什么一起用?
如果是和聚合函数啥的比如max一起用则就是过滤用的。
不过更常见的是和它一定和Group by一起用,没有group by分组having就用不上了.
5. Groupby的使用?
其实刚刚提到了:聚合函数和普通字段一起的时候一般都要用到group by
这里随着group by追问了一下:如何在一个SQL查询里查询员工表的男女性人数?
太紧张了= =非常简单的问题,放在leetcode上肯定是easy的评级
我重复到:也就是需要对员工表做一个条件查询对吗?(也就是这句话给我自己埋下了坑)
1. 可以分别查询后做一个联合
select count(1) as 'male' from employee where sex = 'male'
union all
select count(2) as 'female' from employee where sex = 'female';
如果sex上有索引则会走索引。
但是事后想起来这是相当于进行了两次查询,效率一般。
2. 看着面试官不太满意,我说:条件查询去做,用mysql中的if进行查询,分别统计男女的人数
select
sum(case when sex="male" then 1 else 0 end) as 'male',
sum(case when sex = "female" then 1 else 0) as 'female'
from employee;
相当于做了聚合函数里的一个条件判断。
3. 面试官也不太满意,说提示你一下:考虑一下刚刚的group by? 这次不要说思路,直接给代码。
我恍然大悟:为啥一定要做条件判断,groupby这里不就是活生生的例子嘛。平时写sql也没少用group by,在这里反而被自己一开始卡住了,一下没反应过来。
答:select sex, count(*) from employee group by sex;
答出来了但是很险,是面试官的想要的答案。但是几经周折,卡在这么简单的问题上让自己有一点点受挫。
5. 你有做过并发相关的东西吗?怎么做的?
并发控制主要是针对堆中的线程共享内存做的并发,之前有遇到过一次并发修改异常的案例。
(这里是不是应该再提一下常见的并发控制手段?比如Syncrhonized/ Lock/ CAS/ volatile等)
当时直接讲了项目以前遇到的一个并发上的异常:简单来说是,把redis远程缓存修改为了调用本地缓存,而在读本地缓存后放在了一个List中进行储存和后续修改,当时在并发的情况下就抛出了异常,因为list在堆中并且在并发的条件下去读和写肯定是会产生覆盖的,它在迭代器中写的时候会检查版本号,如果发生了变更则会抛出并发修改异常。
当时解决没有加锁,而是通过theadloacl去做的。借鉴了一下java内存模型,因为分为主存和线程私有工作线程嘛,我需要修改的话就可以把主存的东西做一个线程私有的分配,在写入的时候再刷回到主存,而不是直接在主存上修改。
6. 之前有学过C语言的课程吗?
没有,直接主修Java,python,面向应用层编程。
7. 具体想做什么方向呢?
研发,比较偏向于Web和分布式,如果之后能够接触云会更好。
8. 说说你的缺点?
9. 说说你的优点?
10. 你认为面试的重要性?
时间紧迫,没有反问环节。