本期是【大厂面试】系列文章的第16期,题目选自华为一面。
面试开始
面试官:看你简历写了熟悉计算机 ,来讲讲HTTP长连接和短连接?
独白:大家都知道HTTP长连接是什么吗?
大彬:HTTP短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。HTTP1.0默认使用的是短连接。
大彬:HTTP长连接:指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。
大彬:HTTP/1.1起,默认使用长连接。要使用长连接,客户端和服务器的HTTP首部的Connection都要设置为keep-alive,才能支持长连接。
面试官:HTTP POST和GET请求有什么区别呢?
大彬:主要有以下5点区别:
GET请求参数通过URL传递,POST的参数放在请求体中。GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把请求头和请求体一并发送出去;而对于POST,浏览器先发送请求头,服务器响应100 continue,浏览器再发送请求体。GET请求会被浏览器主动缓存,而POST不会,除非手动设置。GET请求只能进行url编码,而POST支持多种编码方式。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。面试官:讲讲数据库的三大范式?
独白:经典八股文啦~
独白:你在面试过程遇到这种问题吗?
大彬:之一范式,确保数据库表字段的原子性。
大彬:比如字段 userInfo: 广东省 10086' ,依照之一范式必须拆分成 userInfo: 广东省 userTel: 10086两个字段。
大彬:第二范式,首先要满足之一范式,另外包含两部分内容:
大彬:一是表必须有一个主键;
大彬:二是非主键列必须完全依赖于主键,而不能只依赖于主键的一部分。
大彬:具体例子可以查看简介区文字版
大彬:举个例子。假定选课关系表为student_course(student_no, student_name, age, course_name, grade, credit),主键为(student_no, course_name)。其中学分完全依赖于课程名称,姓名年龄完全依赖学号,不符合第二范式,会导致数据冗余(学生选n门课,姓名年龄有n条记录)、插入异常(插入一门新课,因为没有学号,无法保存新课记录)等问题。
大彬:可以拆分成三个表:学生:student(stuent_no, student_name, 年龄);课程:course(course_name, credit);选课关系:student_course_relation(student_no, course_name, grade)。
大彬:第三范式,首先要满足第二范式。另外非主键列必须直接依赖于主键,不能存在传递依赖。
大彬:即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
大彬:假定学生关系表为Student(student_no, student_name, age, academy_id, academy_telephone),主键为"学号",其中学院id依赖于学号,而学院地点和学院 依赖于学院id,存在传递依赖,不符合第三范式。
大彬:可以把学生关系表分为如下两个表:学生:(student_no, student_name, age, academy_id);学院:(academy_id, academy_telephone)。
面试官:讲讲快照读和当前读?
大彬:快照读:读取的是快照版本。普通的SELECT就是快照读。通过mvcc来进行并发控制的,不用加锁。
大彬:当前读:读取的是最新版本。UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE是当前读。
面试:MySQL是如何避免幻读的呢?
大彬:快照读情况下,InnoDB通过mvcc机制避免了幻读现象。
大彬:而mvcc机制无法避免当前读情况下出现的幻读现象。
大彬:因为当前读每次读取的都是最新数据,这时如果两次查询中间有其它事务插入数据,就会产生幻读。
大彬:在当前读情况下,MySQL通过next-key来避免幻读。
大彬:next-key包括两部分:行锁和间隙锁。行锁是加在索引上的锁,间隙锁是加在索引之间的。
面试官:不错,直接给你发offer了
旁白:加班太多怕扛不住...