php面试题精选(一)

2.数据库设计经验,为什么进行分表? 分库?
一般多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?可以举例说明
答:1.mysql数据库在insert的时候会锁表,期间的读写操作需要等待【分表】
2.随着数据量的增多,查询会变得越来越慢,影响数据库性能【分表】【分库】
3.单台DB无法支撑庞大的数据量【分库】
4.mysql可以处理处理数据量大的表,但对于大量数据的表结构调整相关的操作基本不在可能

1.测试数据可知,单表1000万条数据的读写性能还是可以的,因此建议单表数据为字型的在800万左右分表,字符型数据的在500万左右分表
2.根据数据库的存储能力来判断是否需要分库操作

1.目的都是为了提高效率,提高mysql的性能,降低查询操作的反应时间,加大mysql的并发能力

1.数据库垂直拆分:就是将一个大表分为多个小表.把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,
一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要join操作。
比如物料有很多属性,不同的部门有不同的属性需求,比如财务部门有财务的属性要求,采购部门有采购的属性要求,
按部门要求不同拆分为不同的表,仅将基本的公共属性放在主表中,根据不同的部门要求建不同的表及查询视图,性能要好一些.
2.水平拆分:常见维度有 按热点分表 按时间分表 按数据常用性分表
简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据
3.分区:常见方式有 Range List Hash Key
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,
可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

3.数据库优化有哪些? 分别需要注意什么?
答:1.尽量避免全表扫描,首先应考虑where条件或者order by 建立索引
2.where字句中避免使用null值或者!= 或 <>操作符或者用or做连接条件或者in/not in或者变量参数或者使用函数做查询,可能导致全表扫描
3.提高效率可以使用全文索引 sphinx
4.update更新1,2个字段不要update全部字段
5.对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差
6.适当使用索引
7.尽量使用数字型字段,用varchar/nvarchar 代替char/nchar
8.避免频繁创建或者删除临时表 避免使用游标 避免使用大事务操作,提高并发能力 避免想客户端返回大量数据
9.对于DELETE或INSERT语句,进行拆分操作 因为这两个操作会锁表 时间过长会让web服务器奔溃

4.web开发方面会遇到哪些缓存? 分别如何优化?
答:1 应用程序实现的动态页面缓存
应用程序把动态文件生成的html文件缓存到文件服务器,以后用户请求动态文件,直接从文件服务器加载对应的静态缓存的html文件返回给用户,
这里面主要节省了动态语言的执行时间和数据库访问时间。但是会增加了缓存框架的加载和缓存查找的时间。
2 把解释执行的开发语言编译成为目标代码
这个主要把解释执行的高级语言,例如java,php直接编译成为平台相关的目标代码,汇编代码。在java里面,比较著名的就是即时编译器(JIT),
其他的语言也要类似的机制。这里面主要节省了就是解释执行代码的时间。这个会增加即时编译的时间。
3 利用反向代理服务器的缓存
利用类似nginx的反向代理服务器,对请求的url对应的输出的进行缓存。这个缓存和应用程序实现的动态页面缓存类似,
只不过用反向代理充当了应用程序的缓存实现。主要节省了动态余元执行时间和数据库访问时间。
4 客户端浏览器缓存
客户端浏览器缓存主要是通过在http头部增加
Last-Modified,If-Modified-Since,Expires,Cache-Control等标识,和服务器进行协商,是否是采用客户的本机缓存来实现。
其中这里面也会分为2种方式
1 通过Last-Modified,If-Modified-Since方式和服务器通信,客户发出http请求中包含If-Modified-Since,如果服务器端代码没有修改,
服务器端返回302响应代码的请求响应头(内容不返回)客户端则直接用本机缓存的内容缓存显示结果。相当于节省了服务器执行代码时间以及数据传输时间。
2 通过Expires,Cache-Control控制,客户端发现如果上次请求的页面还未过期,通过Expires或者Cache-Control进行辨别,则直接显示本机缓存的内容,不与服务器进行通信。
总结: 1 一般的高并发的应用程序,都在web层采用了以上几种缓存,一般静态资源(图片,js,css)都会采用nginx反向代理+客户端缓存来实现。
2 对于门户网站,尤其是首页的新闻,一般都会缓存起来,可以通过反向代理也可以通过应用程序缓存实现方式
3 对于下载或者视频网站,由于数据传输比较大,直接采用浏览器本地缓存实现。

发表评论