最新整理的PHP⾼级⾯试题来啦!【附答案】
mysql
1、谈谈你在写sql语句需要注意有哪些点?h5制作网站要多少钱
答:
1. select * 问题,客户端需要什么,就给什么,不要给多余的字段,这种情况可能还会导致本来可以⾛覆盖索引的语句不能⾛覆盖索
引。
2. 不要在查询语句字段上做函数运算,这样会让索引失效。
3. ⼀定要避免mysql⾃动类型转换,⽐如 where ‘9’ =9。
4. 能不设置允许 null 的字段尽量不要设置,因为 null 会导致 mysql 多⼀层判断。
5. 使⽤ like 的时候如果是通配符 % 在最前⾯的话也会⾛的全表扫描。
欢迎补充。
2、你刚才⼀直在提索引,把你知道的关于索引的⼀些技巧说下
答:
1. 要在区分度⾼的字段上建⽴索引,否则索引意义不⼤。
2. 字符串建⽴索引要注意⼤⼩,索引长度过长,占⽤的空间也就越⼤,适当的可以截取进⾏索引,缺点是不能使⽤到覆盖索引,具体根
据业务合理安排。琵琶拼音
3. 建⽴联合索引要知道最左前缀原则,举个例⼦( name, email, phone ),最终能⾛这个联合索引的⼀定只会是 ( name ),( name,ssm框架怎么实现数据交互
email ),( name, email, phone ),其他只能⾛全表,需要根据业务合理设置联合索引的顺序。
3、索引底层是什么数据结构?
答:B+树。
4、为什么⽤的是B+树,不能使⽤红⿊树或者其他的?
答:可以使⽤红⿊树。但是这样的话可能会造成树的⾼度过⾼,意味着相同查询下,会进⾏更多的磁盘I/O,影响性能,⽽ B+ 树可以保持树的⾼度不⾄于过⾼。这道题答得不是很好,不仅仅是这样,欢迎补充。
5、你知道索引下推吗?
本质上是对普通索引需要回表的⼀种优化,也就是引擎层在对索引指针遍历的过程中,先做⼀些优先的判断,过滤掉不符合条件的,可以减少磁盘IO。
6、假设现在有⼈操作数据库,不⼩⼼执⾏错了语句,误删除了很多数据,这时候能恢复吗?咋么恢复。
答:⾸先,⼀定要开启 bin-log ,如果没有开启的话,可能就恢复不了。要看具体的⽂件系统是否能恢复。开启了 bin-log ,类型设置要设置成 row 或者 mixed ,不能设置 statement 。然后,如果是误删⾏的话,就可以把⾥⾯对应的删除事件换成插⼊事件,在备⽤库上执⾏。如果是误删表的话,可以先获取最近的⼀次全量备份,放到备库,然后拿出 bin-log , 除了不执⾏删除的事件,其他事件依次重放。
7.为什么不能设置成 statement ?
答:设置成 statement ,实际 bin-log 存储的是 sql 语句( ⾮具体删除的主键id ),这样如果是主从架构的话,主和从可能因为选择的索引不⼀样⽽导致主从不⼀致。
8.你刚才说到主从,那你说说主从运⾏的机制吧
答:⾸先主库还是要开启 bin-log , 从库先设置要连接的主库 change master…… 然后执⾏ start slave,这时候从库会创建两个线程,⼀个 io_thread ,主要负责连接主数据库。⼀个sql_thread 主要是负责执⾏中转⽇志语句。⾸先,主库接收到从库的同步请求,根据传递的 bin-log ⽂件名和开始同步的位置,发送⼆进制⽂件给从库,从库 io_thread 负责把接收到的数据放⼊到中转⽇志,然后 sql_thread 负责从中转⽇志读取解析执⾏,执⾏完成,更新同步的位置标志。
桌游switch是什么意思9.你知道主从延迟吗?有些时候延迟的时间还会很长。遇到这种情况咋么办?
答:这种问题,注意了。划重点。问你出现问题,寻解决⽅案的时候,⼀定要对症下药,也就是说这个问题你可以这样考虑,什么情况下导致的主从延迟。
1. 如果主库和从库服务器配置不⼀样,从库的差点,那么就可能导致延迟时间加长。这时候,换成相同的服务器配置服务器即可。
2. 从库压⼒太⼤了。⼀般主从了,从库基本⽤来查询,⽐如可能运营或者开发者⾃⼰都在从库上进⾏
⼀系列的 sql 操作。那简单呗。多
配⼏个从库,分摊压⼒,⼀主多从。
3. ⼤事务。⽐如 delete 这种语句 不 limit 限制⼀下,如果数据量过⼤,导致主库运⾏时都花费了长时间,再同步到从库,这个时间间隔
过长。
设计模式
你知道哪些设计模式,你平常有使⽤到吗?可以结合你的业务场景说下吗?
答:这⾥我先举例平常使⽤ Laravel,⾥⾯就⽤到⼤量设计模式,⽐如门⾯,组合,装饰,观察者…… 具体场景带⼊,然后根据之前业务上的场景说了下……., 最后也说了设计模式不是银弹,只有在合适的场景使⽤合适的模式才能体现它的价值。
⼿写算法
给定⼀个已排序的数组和⼀个指定值,返回指定值在数组中的下标位置,如果不存在,返回把给定值插⼊到数组之后的下标位置。注意时间复杂度。
⽐如给定有序数组 [1,3,5,6] 给定值5.那么返回下标2.
给定有序数组[1,3,5,6] 给定值 7,返回下标4.
答:
function searchInsert($nums,$target){
if(!count($nums))return0;
$l=0;
$r=count($nums)-1;
while($l<=$r){
$middle=$l+(($r-$l)>>1);
if($nums[$middle]==$target)return$middle;
if($nums[$middle]<$target){
$l=$middle+1;
}else{
$r=$middle-1;
}
}
return$l;
}
典型的可以使⽤⼆分,时间复杂度 O(log2n)。空间复杂度O(1)。
⽹络
1、传输层主要有哪些协议?
答:主要有 TCP 和 UDP 协议。他们的区别是 TCP 是需要连接的 会经过三次握⼿,⽽且可以保证消息的可靠性。UDP 是不需要连接的,不保证消息的可靠性。
2、你能⼤体说说 TCP 的三次握⼿吗?
pythondeque用法答:⾸先服务器监听某个端⼝,客户端发起请求 携带syn数据包(第⼀次),服务端接收到这个数据包,返回 syn/ack 的数据包给客户端(第⼆次),最后客户端再次发送⼀个 ack 的数据包(第三次)。
3、为什么需要三次握⼿?
答:主要是为了确认双⽅接收是否正常。
第⼀次:客户端什么都不能确认。服务端能确认客户端的发送正常,⾃⼰的接收正常
第⼆次:客户端能确认⾃⼰的发送和接收正常,服务端的发送和接收正常。服务端能确认⾃⼰接收正常,客户端的发送正常。
第三次:全部都能确认了。
并发
假设现在有多个⼊⼝可以同时使⽤⼀个账户操作,这个账户只有⼗块钱,有哪些⽅法可以使得不超扣消费?开放性题⽬,只要能解决问题的就是好⽅案,没有唯⼀答案。
答:mysql:可以直接 where amount>=current_amount and amount>0 …… , 或者悲观锁 for update。redis:lua 脚本。php 层⾯可以利⽤⽂件锁,还可以使⽤队列的特性,只有⼀个消费的出⼝。
设计
如果我们公司有很多项⽬都有登录的功能,咋么设计?
答:需要把这个登录单独抽出来作为⼀个模块开发,类似于登录中⼼,所有的其他⼦系统登录都需要从这个系统中认证。
其他
1、看你项⽬⾥说到使⽤过swoole,也写点go,你可以说说他们协程上的区别吗?
答:设计上他们是⼀样的,主要区别在于,协程调度器模式。swoole 的协程调度器是单线程,go 的协程调度器是多线程。这就意味着,同⼀时刻 swoole 只有⼀个协程在运⾏,⽽ go 同⼀时刻可以多个协程在运⾏。所以在 swoole 协程中不需要对全局变量进⾏加锁。⽽且swoole 本质是单线程多进程的,意味着它没有超全局的变量,仅仅是进程级别变量。⽽ go 多线程,多线程必然会存在临界变量锁的问题。当然,go 也提供了开箱即⽤的 sync 读写锁,或者你也可以直接使⽤通道来代替。
2、你可以说说 go 的 gmp 调度模型吗?
答:巴拉巴拉半天,⾃⼰都觉得没说清楚,好吧,我不是很了解。此时猜测⾯试官⼼⾥,早说不知道不就完事了吗
3、说说你们这个项⽬最难的点是哪个地⽅,你是咋么解决的?
那就要看你⾃⼰对项⽬的掌握程度以及这个项⽬的含⾦量了。
点关注,不迷路
好了各位,以上就是这篇⽂章的全部内容了,能看到这⾥的⼈呀,都是⼈才。之前说过,PHP⽅⾯的技术点很多,也是因为太多了,实在是写不过来,写过来了⼤家也不会看的太多,所以我这⾥把它整理成了PDF和⽂档,如果有需要的可以
mysql查询面试题及答案
更多学习内容可以访问
以上内容希望帮助到⼤家,很多PHPer在进阶的时候总会遇到⼀些问题和瓶颈,业务代码写多了没有
⽅向感,不知道该从那⾥⼊⼿去提升,对此我整理了⼀些资料,包括但不限于:分布式架构、⾼可扩展、⾼性能、⾼并发、服务器性能调优、
TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点⾼级进阶⼲货需要的可以免费分享给⼤家,需要的可以加⼊我的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。