美文网首页
php面试问题总结

php面试问题总结

作者: 米阔酱 | 来源:发表于2018-03-19 14:56 被阅读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

    相关文章

      网友评论

          本文标题:php面试问题总结

          本文链接:https://www.haomeiwen.com/subject/lqkpqftx.html