面试前:
第一次开始写博客,本人在校大部分时候都是使用java进行开发,16号突然收到欢聚的HR邀请我考虑PHP实习生,我就想着反正在学校也有学习过PHP基础知识,就去试试看嘛,积累经验。好家伙,下午投完简历立马打电话跟我协商面试时间,交流了一下学校和实习生的薪资情况这些,然后约定在20号下午4点线下面试。
20号前往面试:
欢聚公司在地铁南村万博站,我家这边过去还是有点远的,用时大概1小时10分钟左右。地铁B出口一出去就是番禺万达,穿过万达走大概5分钟到欢聚楼下。先是跟写字楼前台的小姐姐说明是来欢聚面试的,登记一下信息,然后会给你个二维码用来进出写字楼的。进去后搭电梯来到28楼,出电梯右转就是欢聚前台,跟他说是来面试的,扫一个二维码签到填信息。然后前台会给一些笔试题,都是很基础的Linux命令,Linux基本知识,一道MySQL的操作题(用到limit),网页静态资源优化加载速度的方法,实现冒泡算法(语言不限),网页状态码(503、404这些),题量不大,都是和编程语言无关的题目,主要是考验基础、底子,基础好的同学估计15分钟就能写完QAQ。算法和Linux这块没有做好准备,笔试就给了面试官很不好的印象。(ಥ_ಥ)
开始面试:
面试官很快就来了前台,看起来很年轻,我们就在大厅找了个地方坐下来谈。但是我笔试题还没写完o(╥﹏╥)o......
国际惯例,先是让我自我介绍一下。然后就从我的项目经历问起,我的项目写的是电子商务网站的分布式系统LNMP部署,所以基本都是在这个项目问。
1、对分布式的理解(根据项目问的)
为了解决传统单体服务架构带来的各种问题,代码数量庞大,迭代测试维护困难,可能因为一处改动测试不到位造成整个服务瘫痪等问题,分布式系统就是将一个大的服务拆分成几十个甚至上百个微小的服务。如果把单体架构服务器比做篮子,那代码就是鸡蛋,不要让所有鸡蛋别装在一个篮子里,也方便大家分工开发,代码不在一个项目里,也不会冲突,最主要的是项目自己维护,多好。比如阿里的 Dubbo,还有 Spring 全家桶里的 Spring Cloud,都是解决分布式微服务架构的优秀框架。
2、问我项目为什么用Memcached做缓存服务器(我说课程需要ヽ(ー_ー)ノ),对Redis有没有了解,Memcached和Redis的区别(因为我项目用到了Memcached)
https://www.cnblogs.com/457248499-qq-com/p/7392653.html(这篇博客总结很到位,大家可以参考)
3、MySQL引擎有哪些(答了InnoDB和MyISAM),接着问InnoDB和MyISAM引擎的区别
区别:
-
InnoDB支持事务,MyISAM不支持
对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
-
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
-
InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键太大,其他索引也都会很大。
而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
-
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
-
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
扩展:如何选择?
-
是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
-
如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB
-
系统奔溃后,MyISAM恢复起来更困难,能否接受;
-
MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
4、熟悉的设计模式有哪些(回答了工厂、单例、观察者),接着问对这些设计模式的理解
https://www.cnblogs.com/dailyprogrammer/articles/12272717.html(供参考)
5、tcp3次握手
(借的图)
- 最开始的时候,客户端和服务端都是Closed(关闭)状态,准备发送连接请求前,Server会进入LISTEN(监听)状态。
- 第一次握手: 客户端(Client)会给服务端(Server)发送请求报文段,并指定同步序列号SYN = 1,ACK = 0, 初始序号为seq = x,(seq里面就是字节的序号),同时TCP的客户端进程进入SYN-SENT(同步已发送)状态。
- 第二次握手: 服务端收到客户端发送的请求报文SYN后,会向客户端发送一个SYN报文作为应答,表示同意建立连接,同时指定了自己的SYN = 1, ACK = 1,还会向客户端发送seq = y,来表示自己的一个初始序号,同时也会告诉客户端下一次应该从哪开始发送的确认序号,由于客户端发送过来的初始序号seq = x, 所以确认序号ack = x + 1,这时,TCP的服务端进入SYN-RCVD(同步收到)状态。
- 第三次握手: 客户端收到服务端的确认报文之后,会再次向服务端发送确认信息,表示已经收到。所以ACK = 1, seq = x + 1, ack = y + 1。TCP建立连接,客户端和服务器进入ESTAB-LISTEND(已建立连接状态)状态。
6、说说Nginx负载均衡服务器怎么搭建的(根据项目问的)
主要就是先搭建Nginx,然后配置反向服务代理器(用到upstream和proxy_pass),按照这个思路回答
7、对索引了解吗,说说聚簇索引和非聚簇索引的区别
在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对 非聚簇索引 的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是 索引节点,并保留一个链接指向对应 数据块。聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。相比之下,聚簇索引适合排序,非聚簇索引不适合用在排序的场合。因为聚簇索引本身已经是按照物理顺序放置的,排序很快。非聚簇索引则没有按序存放,需要额外消耗资源来排序。当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。
聚簇索引是唯一的,一个 InnoDB 表只有一个聚簇索引,而且一定会有一个聚簇索引,通常为设为主键的列,如果不存在,Innodb 存储引擎会自动添加一个。非聚簇所以可以有多个,而且只能由用户自己添加,InnoDB 默认并不会创建任何非聚簇索引。
8、如果项目出现慢查询,你会怎么去优化,说一下流程?
- 开启查询缓存,优化查询
- explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的
- 当只要一行数据时使用limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
- 为搜索字段建索引
- 使用 ENUM 而不是 VARCHAR。如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是VARCHAR
- Prepared StatementsPrepared Statements很像存储过程,是一种运行在后台的SQL语句集合,我们可以从使用 prepared statements 获得很多好处,无论是性能问题还是安全问题。
- Prepared Statements 可以检查一些你绑定好的变量,这样可以保护你的程序不会受到“SQL注入式”攻击
- 垂直分表
- 选择正确的存储引擎
以上主要是给大家提供一个知识点的思路,有质疑的地方欢迎在评论区指出。我自己也通过总结,对这些知识点加深理解。我个人认为面试的回答最好是自己的个人理解,没必要去死记硬背。多用多学多理解!!
最后然后还是国际惯例,有什么问题要问面试官的,至此面试结束。(✖人✖)
最后还和面试官谈了一下,让我多去了解Redis和Linux操作系统,因为Memcached是比较老的技术了,以及在日常开发中Linux操作环境开发比较多,所以要去多了解。欢聚面试官人特别好,赞赞子。你答不上来的问题都会帮你解疑,给你思路,特别喜欢这一点,让人感觉在面试的过程中是在互相尊重的,像个老师一样(✪ω✪),哈哈哈。
总结
这次面试结果虽然不好,但是是个良好的开端,让我知道自己的记忆缺陷主要集中在算法、设计模式、Linux基本知识这些部分。最近要把这些知识都捡起来,重新回顾理解。还有一定要对自己写在简历上的项目非常熟悉,这个非常重要!!!