php面试问题总结

2018-03-19  本文已影响0人  米阔酱

一、数据库优化策略。

首先从硬件,系统配置,数据库表结构,sql及索引这四个方面考虑优化。

正常来说,硬件和系统配置先撇开不谈。

1、对于数据库表来说,要合理选择适当的字段属性。

①数字类型的字段:不到万不得已不要使用double,这不仅是存储长度的问题更是存储精度的问题。同时固定精度的小数,不建议使用decimal。

②字符类型:尽量避免使用text数据类型,定长字段建议使用char,不定长字段使用varchar,且设定适当的最大长度。

③时间类型:尽量使用timestamp类型,它的存储空间只有datetime类型的一半。对于只需要精确到某一天的数据类型建议使用date类型。

④尽可能将字段使用not null。

2、对于sql语句来说,要书写高效的sql语句,在对sql语句进行分析的时候,可以利用explain看查询计划。

①尽量避免使用select *  ,因为查询数量加大的时候,性能的影响不在数据查找,而在I/0操作。

②利用limit 1来取得唯一行

③避免使用 like,exist,in等标准表达式,它们会引起索引无效,而引起全表扫描。

④尽量减少使用负逻辑操作符和函数,它们会导致全表扫描。而且容易出错,可以把含有not 、<>、!=等负逻辑条件表达式转化为意思相当的正逻辑。

⑤尽量利用join来代替子查询

⑥使用union来代替手动创建临时表

⑦必要的时候可以使用事物。

3、对于索引而言,要合理使用索引。

①在经常用作过滤器或者查询频率较高的字段上创建索引。也就是说,索引不要创建在select查询的字段上,而是要放在where条件字段上。

②在sql语句中经常进行group by ,和order by 的字段上创建索引。

③不必要在不同值较少的字段上创建索引,例如性别字段。

④尽量避免对于经常存取的列创建索引。

⑤用于连接的列(主键/外键)创建索引。

⑥在经常存取的多个列上建立复合索引,但要注意复合索引建立的顺序要按照使用的频度来确定。

⑦删除冗余的,不用的索引。

4、选择合理的存储引擎

5、最后,打开慢查询,及时发现需要优化的sql,在表中删除数据之后,要及时地释放空间,例如optimize table  这个操作。

6、合理使用存储过程和视图,适当使用表分割,表分区。

二、larvel或者yii容器的控制反转。

三、冒泡排序,快速排序

1、冒泡排序

•  将序列中所有元素两两比较,将最大的放在最后面。

•  将剩余序列中所有元素两两比较,将最大的放在最后面。

•  重复第二步,直到只剩下一个数。

/**

* 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上   而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。

* 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。*/

public bubbleSort($a) {

$temp = 0;

for ($i = 0; $i < count($a) - 1; $i++) {

for ($j = 0; j < count($a) - 1 - i; j++) {

if ($a[$j] > $a[$j + 1]) {

$temp = $a[$j];

$a[$j] = $a[$j + 1];

$a[$j + 1] = $temp;

}

}

}

}

2、快速排序(时间最快)

•  选择第一个数为p,小于p的数放在左边,大于p的数放在右边。

•  递归的将p左边和右边的数都按照第一步进行,直到不能递归。

/**

* 基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,

* 此时基准元素在其 排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

*/

public  quick($a2) {

if (count($a2) > 0) { // 查看数组是否为空

$this->_quickSort($a2, 0, count($a2) - 1);

}

}

public _quickSort($list, $low, $high) {

if ($low < $high) {

$middle = $this->getMiddle($list, $low, $high); // 将list 数组进行一分

$this->_quickSort($list, $low, $middle - 1); // 对低字表进行递归排序

$this->_quickSort($list, $middle + 1, $high); // 对高字表进行递归排序

}

}

public getMiddle($list, $low, $high) {

$tmp = $list[$low]; // 数组的第一个作为中轴

while ($low < $high) {

while ($low < $high && $list[$high] >= $tmp) {

$high--;

}

$list[$low] = $list[$high]; // 比中轴小的记录移到低端

while ($low < $high && $list[$low] <= $tmp) {

$low++;

}

$list[$high] = $list[$low]; // 比中轴大的记录移到高端

}

$list[$low] = $tmp; // 中轴记录到尾

return $low; // 返回中轴的位置

}

四、索引类型,存储引擎的区别。

五、php string和array相关的方法。

六、使用redis有哪些好处 与memcached比有哪些优势

1、速度快,因为数据存在内存中

2、redis支持丰富的数据类型,支持string,lists ,sets,sorted set ,hashes

3、支持事物,操作都是原子性的。

4、丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将自动删除。

优势:

1、memcached所有的值均是简单的字符串,key-value型的,而redis支持的数据更多。

2、redis的速度比memcached快很多。

3、redis可以持久化数据。

4、redis单个value最大限制是1GB,而memcached只能保存1mb的数据。

七、一致性哈希算法

八、mysql中,myisam与innodb的区别

1、innodb支持事务,myisam不支持;

2、inndb支持行级锁,myisam支持表级锁;

3、innodb支持mvcc(多版本并发机制),myisam不支持;

4、innodb支持外键,myisam不支持;

5、innodb不支持全文索引,myisam支持;

九、innodb日志与事务的实现方式

事务日志包括:重做日志redo和回滚日志undo

Redo记录的是已经全部完成的事务,就是执行了commit的事务,记录文件是ib_logfile0 ib_logfile1

Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录下表空间中的(共享表空间或者独享表空间)一般情况下,mysql在崩溃之后,重启服务,innodb通过回滚日志undo将所有已完成并写入磁盘的未完成事务进行rollback,然后redo中的事务全部重新执行一遍即可恢复数据,但是随着redo的量增加,每次从redo的第一条开始恢复就会浪费长的时间,所以引入了checkpoint机制

Dirty page:脏页 什么意思呢?

一般业务运行过程中,当业务需要对某张的某行数据进行修改的时候,innodb会先将该数据从磁盘读取到缓存中去,然后在缓存中对这条数据进行修改,这样缓存中的数据就和磁盘的数据不一致了,这个时候缓存中的数据就称为dirty page,只有当脏页统一刷新到磁盘中才会是clean page

Checkpoint:如果在某个时间点,脏页的数据被刷新到了磁盘,系统就把这个刷新的时间点记录到redo log的结尾位置,在进行恢复数据的时候,checkpoint时间点之前的数据就不需要进行恢复了,可以缩短时间

十、mysql数据库如何防注入(数据安全策略)

1、使用预编译、和绑定变量;

采用预编译后,sql引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入什么,都不会影响sql的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行。

2、使用mysql存储过程、

3、利用正则和php addcslashes(),addslashes()函数。

十一、explain 出来的各种item的意义

select-type:表示查询中每个select子句的类型。

type:表示mysql在表中找到所需航的方式

possible-key:指出mysql能适用哪个索引在表中能找到行,查询涉及到的字段   上若存在索引,则改索引将被列出,但不一定被查询使用

key:先是mysql在查询中实际使用的索引,若没有使用索引,则显示为null

key-len:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度

ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

extra:包含不适合在其他列中显示但十分重要的额外信息

十二:php新特性

1、标量类型声明;

2、返回值类型声明;

3、null合并运算符(??);

4、太空船操作符(组合比较符);

5、通过define()定义常量数组;

6、新增了匿名类

7、unicode codepoint 转译语法;

8、Closure::call()

9、为unserialize()提供过滤

10、IntlChar

11、预期

12、use 加强

13、Generator 加强

14、整除,新增了整除函数 intdiv(),使用实例

十三 给定一个字符串输出字符串的所有排列,例如给定 abc 需要输出 abc acb bac bca cab cba 。

十四 求一个矩阵中的最大二维子矩阵(元素和最大)并说出时间复杂度

十五  sql语句的复习

1、SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName

2、SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons, Orders

WHERE Persons.Id_P = Orders.Id_P

上一篇下一篇

猜你喜欢

热点阅读