面试题记录
1、explain具体哪些等级
具体有system、const、range、index、all
2、MySQL优化
- 避免全表查询,首先应考虑在 where 及 order by 涉及的列上建立索引
- 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描(可以将字段默认值设置为0)
- 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描
- 应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20
- n 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3
- 下面的查询也将导致全表扫描:select id from t where name like ‘%李%’若要提高效率,可以考虑全文检索。
- 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
- 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算
- 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
- 很多时候用 exists 代替 in 是一个好的选择:select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num) - 索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
- 任何地方都不要使用 select from t ,用具体的字段列表代替“”,不要返回用不到的任何字段。
- 尽量避免大事务操作,提高系统并发能力.
- 分库分别
- 分区分表分库
3、redis支持哪些类型
支持5种类型:字符串、哈希、链表、有序、无序,最新的redis 5.0中,新增stream类型,非常高效的支持队列。
4、PHP7与php5的区别
-
foreach不再改变内部数组指针
-
标量类型声明,在旧版中,函数的参数申明只能是(Array $arr)、(CLassName $obj)等,基本类型比如字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)等是不能够被申明的
-
增加了对返回类型声明的支持
declare(strict_types=1); function add(int $a, int $b){ return $a+$b; } echo add(1,2); echo add(1.5, 2.6);
-
null合并运算符
项目中存在大量同时使用三元表达式和 isset()的情况,新增了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
旧版:isset($_GET[‘id']) ? $_GET[id] : err;
新版:$_GET['id'] ?? 'err'; -
通过define()定义常量数组
在 PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。 <?php define('ANIMALS', ['dog', 'cat', 'bird']); echo ANIMALS[1]; // outputs "cat" const name = ['1','2']; echo name[1];
-
现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义
-
preg_replace_callback_array()
新增了一个函数preg_replace_callback_array(),使用该函数可以使得在使用preg_replace_callback()函数时代码变得更加优雅。在PHP7之前,回调函数会调用每一个正则表达式,回调函数在部分分支上是被污染了。
5. 指针问题
<?php
$array = [1,2,3];
foreach ($array as $k=>&$v){
$v++;
}
var_dump($array);
foreach ($array as $k=>$v){
echo $v;
}
233
6. array_column()
返回输入数组中某个单一列的值。array_column(array,column_key,index_key);
<?php
// 可能从数据库中返回数组
$a = array(
array(
'id' => 5698,
'first_name' => 'Peter',
'last_name' => 'Griffin',
),
array(
'id' => 4767,
'first_name' => 'Ben',
'last_name' => 'Smith',
),
array(
'id' => 3809,
'first_name' => 'Joe',
'last_name' => 'Doe',
)
);
$last_names = array_column($a, 'last_name', 'id');
print_r($last_names);
?>
结果
Array
(
[5698] => Griffin
[4767] => Smith
[3809] => Doe
)
7. 取出前五通话记录
select name,count(*) as num from order
where date_sub(curdate(), INTERVAL 10 DAY) <= date(`created_at`)
group by name
order by num desc
limit 10;
8. php扩展安装
//下载libevent扩展文件压缩包(在当前系统哪个目录下载随意)
~# wget http://pecl.php.net/get/libevent-0.1.0.tgz
//解压文件
~# tar -zxvf libevent-0.1.0.tgz
//进入源码目录
~# cd libevent-0.1.0/
//运行phpize命令,写全phpize的路径
~# /usr/local/php/bin/phpize
//运行configure命令,配置时 要将php-config的路径附上
~# ./configure --with-php-config=/usr/local/php/bin/php-config
//运行make命令
~# make
//测试编译安装
~# make test
//正式编译安装
~# sudo make install
//修改php.ini,结尾加入:extension=libevent.so
//重启对应的php-fpm
9. session和cookie的关系
前提是服务端开启了session
1. 第一次访问页面时, 服务端生成一个不重复的sessionid(当前会话id)以及命名为sess_xxx的session文件
该session文件保存在php.ini文件中指定的目录, xxx是sessionid, sessionid可以通过session_id()函数来获取
2. 服务端向客户端返回响应, 其中有响应头Set-Cookie:PHPSESSID=xxx
3. 客户端收到Set-Cookie响应头, 将sessionid写入cookie, cookie的key为PHPSESSID, value为sessionid
比如PHPSESSID=jlis2mcmv6d5hejkemom77ibm3
4. 当第二次访问页面时, 客户端会把cookie放在请求头(Request Header)中, 服务端识别PHPSESSID这个cookie
然后根据这个cookie获取当前会话ID(sessionid), 从而找到对应的session文件, 再从session文件中读取信息
10. jsonp原理
11. ajax跨域
12. 主从复制的原理
13. 运算符优先级问题
<?php
$tmp = 0 == 'a' ? 1: 2;
echo $tmp;
?>
本作品采用《CC 协议》,转载必须注明作者和本文链接