面试题数据库笔试redis查询索引2021phpsql服务器记录了篇
优采云 发布时间: 2021-08-06 23:11面试题数据库笔试redis查询索引2021phpsql服务器记录了篇
标签:面试题数据库笔试Redis查询索引2021phpsql服务器
记录了这段时间我在深圳求职以来被问到的所有问题,以后有机会会继续更新~
内容
数据库文章
一、谈数据库优化?
从sql优化方面:
1.不要返回任何未使用的字段
2.尽量避免全表扫描,在where和order by中涉及的字段上添加索引
3.尽量避免where子句中字段的空值判断,会导致索引失效
4. 尽量避免在 where 子句中使用 != 或运算符,这会使索引无效
5. 尽量避免在 where 子句中使用 or 来连接条件,这样会使索引失效
6.尽量避免对where子句中的字段进行函数式操作,这会使索引失效
在表优化方面:
1.可以横向分表,将一个表拆分成多个结构相同的表,并通过表名区分
2.可以垂直拆分表,将表中较大的字段拆分成另一个表,这个表和原表是一一对应的
从库优化方面:
数据库可以分为主库和从库。主库用于写入数据,多个从库用于读取数据。主库和从库可以通过一定的机制实现数据同步。
二、Mysql 有哪些索引?
从逻辑的角度来看:
1.普通索引:最基本的索引,没有任何限制
2.主键索引:特殊的唯一索引,不允许有空值
3.唯一索引:索引字段的值必须是唯一的,可以有空值
4.复合索引:在多个字段上创建的索引,遵循最左前缀集的原则
5.全文索引:可以在varchar或text字段上创建
从物理角度来看:
1. 聚集索引
2.非聚集索引
三、什么是交易?
一组满足 ACID 特性的操作。 ACID 包括原子性、隔离性、一致性和持久性。
四、Inno 和 MyISAM 有什么区别?
1. InnoDB 支持事务、外键、行级锁等高级数据库功能,适合频繁修改和高安全性的应用
2. MyISAM 不支持事务等高级数据库功能。适用于注重查询和插入,更注重查询性能的应用
五、什么是sql注入?怎么处理?
SQL 注入是指 Web 应用程序不判断用户输入数据的合法性或过滤不严格,导致攻击者在预定义的 SQL 语句中添加额外的 SQL 语句以欺骗数据库并执行非- 授权任意查询
解决方案:
1. 验证用户的输入,可以通过正则表达式表达或者限制长度
2. 使用参数化的 sql 而不是动态组装的 sql
3.避免直接响应数据库中的异常信息,最好自定义打包错误信息
4. 限制数据库权限
六、如何分析sql?解释中常见的字段有哪些?
使用explain关键字可以模拟优化器执行SQL语句,分析查询语句或结构的性能瓶颈
常用字段:
1.id:表的读取顺序,id相同,读取顺序从上到下,id不同,值越大优先级越高
2.select_type:查询类型simple表示简单查询,不包括子查询或联合查询;
如果查询收录复杂的子部分,则最外层查询为主;
select 或 where 列表中收录的子查询将被标记为子查询; from 列表中收录的子查询将被标记为派生的;联合之后的第二个选择将被标记为联合
3.表:显示sql操作属于哪个表
4. type:表示sql语句的质量,从好到坏,顺序为system>const>eq_ref>ref>range>index>all
5. possible_key: 可能使用的索引
6.key:实际使用的索引
七、谈谈数据库锁?
在并发的情况下,事务的隔离性很难保证。解决办法是加锁
共享锁/读锁:成功申请读锁的前提是没有其他线程对查询结果使用了写锁。读锁申请成功后,其他线程可以读,但不允许写操作。 , 甚至不在当前线程中
排他锁/写锁:写锁申请成功的前提是没有其他线程对查询结果使用过读锁或写锁。写锁申请成功后,其他线程无法对其进行读写操作。
八、什么是死锁?如何解决?
由于资源竞争,两个或多个线程正在相互等待
解决方法:尽量使用低隔离级别,并且锁住厂商设计的所有数据,否则不会被执行
九、笔试:如何查看每个班级的前三名?
select stu.class,stu.score
from student stu
where (select count(*) from student where class=a.class and a.score $a[$j]) {
$tem = $a[$i];
$a[$i] = $a[$j];
$a[$j] = $tem;
}
}
}
网络文章
一、tcp 的五层协议是什么?
应用层、传输层、网络层、数据链路层、物理层
二、聊聊tcp三次握手?
1.客户端向服务器发送连接请求段,其中SYN设置为1,然后选择一个起始序号seq=x
<p>2.服务器收到请求段后,向客户端发送确认段,其中SYN和ACK设置为1,确认号字段为x+1,起始序号seq=y