一、简单作一下自我介绍, 而后谈一下近三年来你的得意之做?面试
点评:算法
A、此问题考察你的描述同简历的相符之处sql
B、从描述中,发现能够追问的点,追问细节,你是否是真参与了,参与了多少数据库
C、从项目的周期、职责、复杂程序对你的能力进行定位和评估编程
二、面试官看过你的简历,会问一些你作的项目的用户量、PV、吞吐量、相关难点和解决方法等缓存
点评:安全
A、目标同上。服务器
三、数据库设计经验,为何进行分表? 分库? 通常多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?能够举例说明多线程
点评:
A、考察常规技术的掌握
B、经过概念回答的过程当中,要求明确具体场景
C、问至操做细节,来考察面试者本身是否作过
答案: 从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。 为什么分库分表: 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。 垂直切分: 何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。 水平切分,当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上 分库分表引发的问题 1 事务问题:在执行分库分表之后,由于到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。 2 跨库跨表的join问题: 在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。 3 额外的数据管理负担和数据运算压力: 额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。
四、数据库优化有哪些? 分别须要注意什么?
点评:
A、此问题相对较泛,回答也能够从多个层面回答。
B、在实际中问,可能会更加具体,好比数据库索引对数据库优化的做用和影响 答案:
- SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。
调整不良SQL通常可以从以下几点切入: 检查不良的SQL,考虑其写法是否还有可优化内容 检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写 检查优化索引的使用 考虑数据库的优化器
-
避免出现SELECT * FROM table 语句,要明确查出的字段。
-
在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
-
查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
-
在判断有无符合条件的记录时建议不要用SELECT COUNT (*)和select top 1 语句。
-
使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。
-
应绝对避免在order by子句中使用表达式。
-
如果需要从关联表读数据,关联的表一般不要超过7个。
-
小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。
-
<> 用 < 、 > 代替,>用>=代替,<用<=代替,这样可以有效的利用索引。
-
在查询时尽量减少对多余数据的读取包括多余的列与多余的行。
-
对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或order by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。
-
多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值条件(=)) and (table1的非等值条件) and (table2与table1的关联条件) and (table2的等值条件) and (table2的非等值条件) and (table3与table2的关联条件) and (table3的等值条件) and (table3的非等值条件)。 注:关于多表查询时from 后面表的出现顺序对效率的影响还有待研究。
-
子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。应该用如下语句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。
-
在WHERE 子句中,避免对列的四则运算,特别是where 条件的左边,严禁使用运算与函数对列进行处理。比如有些地方 substring 可以用like代替。
-
如果在语句中有not in(in)操作,应考虑用not exists(exists)来重写,最好的办法是使用外连接实现。
-
对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读操作在前面完成,数据库写操作在后面完成,避免交叉。
-
请小心不要对过多的列使用列函数和order by,group by等,谨慎使用disti软件开发t。
-
用union all 代替 union,数据库执行union操作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。 当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。
五、Web开发方面会遇到哪些缓存? 分别如何优化?
点评:
A、此问题也比较泛,可是咱们回答要有一个主线。
B、建议结合一个请求从发起到结束的全流程,各个节点来进行回答。
六、给你1G的内存,对10G的文件进行排序(文件每行1个数字),如何实现? 对10G的文件进行查找如何实现?统计10G文件每一个关键字出现的次数如何实现?
点评:
A、先从粗放入手
B、经过面试官和面试者的来回互动,考察对特定算法和方法的使用
C、变换形式进行考察,进行脑力击荡。 答案:分别排序:根据内存1G,数据10G,我们将10G数据切分成10份,通过内存调用磁盘的方式,每1G进行排序,排序结束后,我们会得到10个有序的数据数组。 归并:多路归并过程可以使用败者树或最小堆。为方便起见我还是用最小堆吧,原理是一样的。 内存中开辟一个大小为10的最小堆,和一个缓冲区(小于1G,不要太小)。 取10份排序好的数据的首位进入最小堆。则最小的数位于堆顶,移除堆顶元素并写入缓冲区,然后从移除元素的元素所属数组中的下一位进入最小堆,在次移除堆顶进入缓冲区...直到缓冲区满,缓冲区回写磁盘,清空缓冲区,再次将数据置入最小堆... 直到10份数据全部写完,然后将最小堆的元素按顺序回写磁盘即可。
七、假如你如今是12306火车订票的设计师,你该如何设计知足全国人民订票?
点评:
A、此问答也比较泛,考察的是对解决一个问题的分析思路
B、从哪些方面,哪些层面对问题进行考察
C、对于想到的方面和层面,再细致挖掘考虑是否严谨
八、假若有1亿用户的访问量,你的服务器架构是怎样的? 用户信息的存储方案如何设计?
点评:
A、点评基本同上
B、用户信息存储考察面试者对用户信息业务自己的了解、存储方式及其特色的了解。
九、若是你是技术组长,所带团队任务进度没法完成你该如何解决? 若是在进度排满的前提下插入任务,你该如何保证总进度不延期? 若是有的工程师今天预约任务没有完成,你该如何解决?假如你是技术组长? 如何提升团队效率?
点评:
A、考察带队能力
B、注意不是全部的问题都有很是确定和完美的答案,思考和解决问题的方式,比回答问题自己更为重要
十、从你的经验方面谈一下如何构建高性能Web站点? 须要哪些环节? 步骤? 每一个步骤须要注意什么如何优化等?
点评:
A、点评同第6题
B、建议结合一个请求从发起到结束的全流程,各个节点来进行回答。
十一、为何要对数据库进行主从分离?
点评:
A、考察基本概念,回答能够多轮互动,越问越深,能够考察学习者的态度。
B、对问题的掌握深度,考察出是否真的作过
C、能够延展至相关问题,好比数据库的备份、扩容等话题
答案:主从复制: 1、当主数据库出现问题时,可以当从数据库代替主数据库,可以避免数据的丢失。 2、可以进行读写分离 读写分离: 1、避免从数据库进行写操作而导致的主从数据库数据不一致的情况,因为当主从数据库数据不一致时,那么从数据库最主要的备份任务就没有意义了。 2、减轻主数据库的压力。因为进行写操作更耗时,所以如果不进行读写分离的话,写操作将会影响到读操作的效率。
十二、如何处理多服务器共享Session?
点评:
A、考察通用技术处理
B、还能够问及Web 服务器集群相关的其余问题
答案: 1.通过数据库mysql共享session
a.采用一台专门的mysql服务器来存储所有的session信息。
用户访问随机的web服务器时,会去这个专门的数据库服务器check一下session的情况,以达到session同步的目的。
缺点就是:依懒性太强,mysql服务器无法工作,影响整个系统;
b.将存放session的数据表与业务的数据表放在同一个库。如果mysql做了主从,需要每一个库都需要存在这个表,并且需要数据实时同步。
缺点:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担 。但是session一般的查询频率较高,放在数据库中查询性能也不是很好,不推荐使用这种方式。
2.通过cookie共享session
把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。
当访问服务器A时,登录成功之后将产生的session信息存放在cookie中;当访问请求分配到服务器B时,服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。
缺点:cookie的安全性不高,容易伪造、客户端禁止使用cookie等都可能造成无法共享session。
3.通过服务器之间的数据同步session
使用一台作为用户的登录服务器,当用户登录成功之后,会将session写到当前服务器上,我们通过脚本或者守护进程将session同步到其他服务器上,这时当用户跳转到其他服务器,session一致,也就不用再次登录。
缺陷:速度慢,同步session有延迟性,可能导致跳转服务器之后,session未同步。而且单向同步时,登录服务器宕机,整个系统都不能正常运行。
4.通过NFS共享Session
选择一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。
缺点:依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。
5.通过memcache同步session
memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个"内存池",不管是哪个服务器产生的sessoin都可以放到这个"内存池"中,其他的都可以使用。
优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。
缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。
6.通过redis共享session
redis与memcache一样,都是将数据放在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
根据实际开发应用,一般选择使用memcache或redis方式来共享session.
十三、一个10G的表,你用PHP程序统计某个字段出现的次数,思路是?
点评:
A、先粗放式着手
B、再一步步增长限定条件,求得最为高效之法
十四、会告诉你一个Nginx日志例子,用你认为最佳的编程语言统计一下http响应时间超过1秒的前10个url?
点评:
A、日志分析
B、简单明快的方式是 Shell命令组合 awk
十五、给你一个Mysql配置文件,用你认为最佳的编程语言解析该文件?
点评:
A、有些语言自己就提供了函数
十六、给你两个路径a和b,写一个算法或思路计算a和b差距几层并显示a和b的交集?
点评:
A、字符串操做 答案:给定两个路径,首先我们能保证这两个路径的跟路径("/")是一致的,至于显示几层,我们就可以路径格式进行转换为数组, 方便后面比较交集。至于相差几层,对于两个数组直接比较长度即可。
$a = "/Users/kert";
$b = "/usr/sbin";
$aArray = array_filter(explode("/", $a));
$bArray = array_filter(explode("/", $b));
//var_dump($aArray, $bArray);
// 计算相差的层级
$cDiffLenght = count($aArray) - count($bArray);
echo "a路径和b路径相差的层级是:" . abs($cDiffLenght) . PHP_EOL;
// 计算两个的交集
$dMerge = array_intersect($bArray, $aArray);
var_dump("a路径和b路径的交集是:", $dMerge);
// output
a路径和b路径相差的层级是:3
string(30) "a路径和b路径的交集是:"
array(2) {
[1]=>
string(5) "Users"
[2]=>
string(4) "kert"
}
十七、给你一个url,在Nginx配置一下rewrite指定到某个具体路径?
点评:
A、具体技术操做
十八、一个PHP 文件的解释过程是? 通常加速PHP有哪些? 提升PHP总体性能会用到哪些技术? PHP的内存回收机制是?
点评:
A、知其然,知其因此然
B、考察对PHP低层的了解
C、能够针对各类优化方面,深刻来问,问到不能回答为止
十九、Session和Cookie生存周期区别? 存储位置区别?
点评:
A、先提问比较概念上的不一样
B、再比较应用场景和效果上的不一样
二十、require、include、require_once、include_once区别? 加载区别? 若是程序按需加载某个PHP文件你如何实现?
点评:
A、考察基本概念和技术
B、能够一些易混淆的知识
二一、Chrome号称为多线程的,因此多线程和多进程的区别为?
点评:
A、考察基本概念
B、考虑业务应用
二二、PHP在2011年末出现Hash碰撞,Hash碰撞原理为? 如何进行修复?
点评:
A、考察安全和业界问题的关心
B、考察解决问题的思路和对不知道问题的接受能力
二三、Web不安全因素有哪些? 分别如何防范?
点评:
A、比较宽泛,先考出基本点
B、再针对基本点进行细致提问,细化到代码编写和配置层面
二四、假如两个单链表相交,写一个最优算法计算交点位置,说思路也能够?
点评:
A、算法题
B、步步优化
答案:快速找交点,用栈,当然需要O(M+N)的空间复杂度,即两个栈分别保存两个链表的全部节点地址,既然是相交的,那么从相交节点到尾节点一直都会是同一个节点,利用栈特点,两个链表全部节点分别入栈后,两个栈同步的出栈,直到发现第一个不一样的节点,说明上一个节点就是两个链表的交点
二五、Nginx负载均衡有哪些? 若是其中一台服务器挂掉,报警机制如何实现?
点评:
A、考察 Nginx 的功用,工做原理
B、考察运维报警,以及异常检查 答案: 轮询 默认方式 weight 权重方式 ip_hash 依据ip分配方式 least_conn 最少连接方式 fair(第三方) 响应时间方式 url_hash(第三方) 依据URL分配方式
二六、不优化前提下,Apache通常最大链接数为? Nginx通常最大链接数为? Mysql每秒insert ? select ? update ? delete?
点评:
A、考察 LAMP,LNMP 基本组件的常规配置和性能
B、能够进一步考察这些配置的调整和优化
C、更进一步考察在操做系统层面的优化
二七、Mysql 数据类型有哪些 ? 分别占用多少存储空间 ?
点评:
A、考察MySQL 基本知识
B、能够延伸到 MySQL 的其余基本知识
C、索引、缓存、存储引擎等
二八、Nginx设置缓存JS、CSS、图片等信息,缓存的实现原理是?
点评:
A、考察前端优化
B、考察Nginx 配置
二九、如何提升缓存命中率? 如何对缓存进行颗粒化?
A、考察对缓存自己的理解和使用 答案: 1 、尽可能的聚焦在高频访问且时效性要求不高的热点业务上(如字典数据、session、token)
时效性:时效性越低意味着缓存时间越长,缓存时间越长,命中率越高
2、通过缓存预加载(预热):提前将数据加载到缓存中
3、合理调整缓存有效期的时间 :避免同时失效
4、增加存储容量:容量不足时会触发Redis内存淘汰机制
5、调整缓存粒度:通常情况下,缓存粒度越小,命中率越高,如单个用户和所有用户比较
6、更新缓存:当数据发生变化时,直接更新缓存比移除或者让缓存过期的命中率更高
三十:http与webScoket的区别联系? 相同点
1、都是一样基于TCP的,都是可靠性传输协议。 2、都是应用层协议。
区别
1、WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。 2、WebSocket是需要浏览器和服务器握手进行建立连接的。而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接。
联系
WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。