PHP面试题汇总

PHP面试总结与分享

前情提要:本篇文章为博主面试过程遇到的题型,在此总结与分享,会持续进行更新

一.索引分类

①主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
②普通索引:仅加速查询
CREATE INDEX index_name ON table_name(col_name);
③唯一索引:加速查询 + 列值唯一(可以有null)
CREATE UNIQUE INDEX index_name ON table_name(col_name);
④全文索引:对文本的内容进行分词,进行搜索
⑤单列索引:单列索引值对应一个字段的索引,可以包括上述的四种索引方式
⑥组合索引:多列索引值组成一个索引,专门用于组合搜索,其效率大于索引合并(遵循最左原则)
CREATE INDEX index_name ON table_name(col_name_1,col_name_2);(普通组合)
CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);(唯一组合)
⑦空间索引
ps
①索引合并:使用多个单列索引组合搜索
②覆盖索引:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
③修改表建索引:ALTER TABLE table_name ADD INDEX index_name(col_name);
④直接删除索引:DROP INDEX index_name ON table_name;
⑤修改表结构删除索引:ALTER TABLE table_name DROP INDEX index_name;

二.MySQL索引失效的几种情况

①like是以%开头的查询语句
②使用多列索引的查询语句,只有查询条件中使用了这些字段中第1个字段时,索引才会被使用(遵循最左原则)
③使用OR关键字查询语句,要想同时使用,必须or上的字段全部都加索引
④如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
⑤不在索引列上做任何操作(计算,函数,(自动或者手动)类型转换),会导致索引失效
⑥使用不等于(!= 或者<>)的时候,无法使用索引,会导致索引失效
⑦使用is not null 或者 is null会导致无法使用索引
⑧如果使用全表扫描要比使用索引快,则不会使用到索引

三.MySQL优化

四.MySQL的乐观锁和悲观锁

1.乐观锁:总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用以下两种方式实现:
①版本号机制
②CAS操作
2.悲观锁:总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁(注:要使用数据库的悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交),悲观锁分为两种:
①共享锁:共享锁是其它事务可以读但是不能写
SELECT * FROM table_name WHERE … LOCK IN SHARE MODE;
②排它锁:排他锁是只有自己得事务有权限对此数据进行读写
SELECT * FROM table_name WHERE … FOR UPDATE;
ps
加锁必须先开启事务:begin;(开启事务)->加锁、操作->commit;(提交事务,归还锁);锁不是针对事务的,排它锁只有一把,谁拿了谁就可以进行更新,但是没有拿到锁的事务只要在select不加上排它锁也可以查询到数据

5.b+树与b树的区别
https://mp.weixin.qq.com/s/9oAc5QgJ7kub2-HISTnW6A?v=1&from=singlemessage&isappinstalled=0&scene=1&clicktime=1587016326&enterid=1587016326

6.一致性哈希(hash)算法

7.es搜索引擎

8.redis
未完待续~~~

你可能感兴趣的:(PHP)