面试相关
Posted wuan90
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试相关相关的知识,希望对你有一定的参考价值。
1. mysql查询时limit offset比较大时的性能问题 https://blog.csdn.net/fdipzone/article/details/72793837
优化方案:先根据索引查询出主键id,然后根据主键id关联出数据
知识点:
a. mysql一级索引、二级索引,以及innodb与myisam的索引区别
2. Mysql索引原理 https://www.jianshu.com/p/d90f6b028d0e
索引:索引是数据库管理系统中的一个排序的数据结构(通常使用B+Tree)
Mysql引擎:Innodb和MyISAM,两种引擎的索引都是B+Tree数据
Innodb索引与MyISAM索引区别:
a. Innodb索引是聚集索引,数据文件本身就是主键索引,叶节点保存了完整的数据记录。MyISAM索引是非聚集索引,索引和数据分离
b. Innodb辅助索引叶节点data域 存储相应数据的主键值
3. MyISAM与Innodb的区别
1)InnoDB支持事务,MyISAM不支持。
2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。
3)InnoDB支持外键,MyISAM不支持。
4)从MySQL5.5.5以后,InnoDB是默认引擎。
5)MyISAM支持全文类型索引,而InnoDB不支持全文索引。
6)InnoDB中不保存表的总行数,select count(*) from table时,InnoDB需要扫描整个表计算有多少行,但MyISAM只需简单读出保存好的总行数即可。 注:当count(*)语句包含where条件时MyISAM也需扫描整个表。
7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。MyisAM使用delete语句删除后并不会立刻清理磁盘空间,需要定 时清理,命令:OPTIMIZE table dept;
9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’)
10)Myisam创建表生成三个文件:.frm 数据表结构 、 .myd 数据文件 、 .myi 索引文件,Innodb只生成一个 .frm文件,数据存放在ibdata1.log
现在一般都选用InnoDB,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。
应用场景:
MyISAM不支持事务处理等高级功能,但它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
InnoDB用于需要事务处理的应用程序,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
4. 数据库3范式
第一范式:属性的原子性约束,即要求字段不可拆分
第二范式:满足第一范式前提下,非主键字段要完全依赖主键字段,而不是依赖主键字段的一部分(常见于复合主键的情况)
第三范式:满足第二范式前提下,非主键字段不能出现传递依赖(比如某个字段a依赖于主键,而一些字段依赖字段a)
5. 事务四大特性
原子性:一个事务内的一组操作要么都成功,要么都失败
一致性:一个事务使数据从一种正确状态变更到另一种正确状态
隔离性:事务之间彼此隔离互不影响
持久性:事务一旦提交,其结果将是永久的,即便发生系统故障也能恢复
6. 事务隔离级别
读未提交:允许脏读,可以读取到其他事务未提交的数据
读已提交:只能读取到事务已经提交的数据(数据库默认级别)
可重复读:无论其他事务是否已经提交,当前事务读取的数据不受其他事务影响
串行化:事务串行化执行,读写操作会互相阻塞
注意:MySql数据库(Innodb引擎)默认使用可重复读
7. Mysql中的锁
MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高
8. Mysql死锁的原因及解决方法
解决方法:多个session加锁的顺序约定一致
9. delete、drop、truncate的区别
a. truncate和delete只删数据不删表结构,drop删除表结构和数据
b. delete数据DML,需要事务管理,commit后才生效。truncate和drop属于DDL,不需要事务管理,不可回滚
c. 删除速度:drop > truncate > delete
10. 多版本并发控制(MVCC)--乐观锁的一种实现方式
a. 每行数据都存在一个版本,每次数据更新都更新该版本
b. 修改时copy出数据随意更改,各事务之间无干扰
c. 保存时比较版本号,成功则commit;否则,rollback
注意:mvcc只适用innodb中的读已提交(RC)和可重复读(RR)
mvcc实现策略:每一行隐藏两个列(行创建时的版本号和删除时的版本号)
11. 如何进行SQL优化
a. 选择正确的数据库引擎(MyISAM、Innodb)
MyISAM:查询多、支持全文检索、不支持事务、表锁(update性能低,update时阻塞读)
Innodb:不支持全文检索、支持事务、行锁(update性能高)、数据安全性高
b. 优化字段的数据类型
原则:越小的列会越快(smallint比int小,date比datetime小)
c. 为搜索字段添加索引
d. 避免适用select *查询
e. 使用ENUM而不是varchar
f. 固定长度的表会更快。如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。固定长度容易计算偏移量
12. SQL优化技巧:
a. where表之间的连接必须写在其他where条件之前,可以过滤掉大量数据的条件必须写在where子句末尾
b. 用exists代替in、用not exists代替not in
c. 避免在索引列上使用函数计算
d. 避免在索引列上使用is null、is not null
13. exist和in
in是把外表和表作hash join;exist对外表作loop循环,每次循环对表进行查询
如果内表较大则exist效率高;如果内表较小,则in效率较高;如果两个表数据量差不多,则效率差不多
14. char和varchar的区别
a. char是固定长度的,varchar是可变长度的
b. char(M)表示每个值要占固定M个字节,如果长度小于M,Mysql会自动用空格不足
varchar(M)每个值只占用刚好够用的字节再加上一个用来记录其长度的字节
15. MySql主从复制原理 https://blog.csdn.net/Marmara01/article/details/89570522
a. 主:binlog线程——记录下所有改变来了数据库数据的语句,放进master上的binlong日志中
b. 从:io线程——在使用start slave之后,负责从master上拉取binlog内容,放进自己的relay log中
c. 从:sql执行线程——执行relay log中的语句;
16. Mysql复制线程有几个,以及它们之间的关联
a. Master上面的binlog dump线程
b. Slave上面的IO线程,从master上拉取binlog日志,bin写入到relay log中
c. Slave上的Sql线程,读取relay log日志内容,并执行sql语句
d. 如果是多线程复制,Sql线程只做coordinator(调度),即读取relay log中的内容交给worker线程执行。
17. 事务是如何通过日志实现的
因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的
状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉
18. Mysql数据库cpu达到500%如何处理?
当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等
19. 主从一致性校验工具:checksum、mysqldiff、pt-table-checksum
20. Mysql中innodb的行锁是加在什么上实现的?
InnoDB是基于索引来完成行锁
例: select * from tab_with_index where id = 1 for update;
f
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,
如果 id 不是索引键那么InnoDB将完成表锁,并发将无从谈起
21. explain出来的各种item的意义
id:每个被独立执行的操作的标志,表示对象被操作的顺序。一般来说, id 值大,先被执行;如果 id 值相同,则顺序从上到下。
select_type:查询中每个 select 子句的类型(SIMPLE、PRIMARY、UNION、UNION RESULT、SUBQUERY)
table:名字,被操作的对象名称,通常的表名(或者别名),但是也有其他格式。
partitions:匹配的分区信息。
type:连接类型()。
possible_keys:列出可能会用到的索引。
key:实际用到的索引。
key_len:用到的索引键的平均长度,单位为字节。
ref:表示本行被操作的对象的参照对象,可能是一个常量用 const 表示,也可能是其他表的
key 指向的对象,比如说驱动表的连接列。
rows:估计每次需要扫描的行数。
filtered:rows*filtered/100 表示该步骤最后得到的行数(估计值)。
extra:重要的补充信息
######################################################################################
一.jdk8新特性
1. 接口新增默认方法和静态方法。默认方法加上default修饰符,并且有方法体;静态方法使用static声明
2. 函数式接口。接口类上标记@FunctionInterface
2.1
二. 锁
1. synchronized与Lock的区别
a. synchronized是一个关键词,Lock是一个接口
b. 出现异常时synchronized自动释放锁,Lock不能自动释放
c. synchronized不能知道是否已经加过锁,Lock.tryLock能判断是否已经加锁
d. synchronized采用的是CPU悲观锁,即线程获得是独占锁。很多线程阻塞时,会导致CPU频繁切换上下文,效率很低。
Lock采用的是乐观锁,如果有冲突时,会进行重试直到成功。乐观锁的机制是CAS
e. Lock可以让等待锁的线程响应中断,而synchronized则不行
lock.lockInterruptibly(); //允许在等待时由其他线程调用Thread对象的interrupt()方法中断等待锁的线程r
2. Condition的使用
当满足一定条件时,调用condition的await()方法使当前线程休眠进行等待,调用Condition的signalAll()方法唤醒因await()进入等待的线程。
典型的生产-消费模型中可以使用:
ReentrantLock lock = new ReentrantLock();
consummerCond = lock.newCondition();
providerCond = lock.newCondition();
List<String> pool = new ArrayList<String>();
int maxSize = 100;
consummer(){
lock.lock();
try{
//如果池中数据为空,则线程等待
if(pool.size() == 0){
consummerCond.await();
}
pool.get();//从池中消费
providerCond.signalAll();//唤醒所有等待的生产者
}catch(){}
finally{
lock.unlock();
}
}
斐波那契:f(1) = 1 f(2) =1 f(n)=f(n-1)+f(n-2)
####################################################################
1. 为什么要用springboot?
a. 独立运行:内嵌各种servlet容器、tomcat、jetty等
b. 简化配置
c. 自动配置
2. springboot核心配置:
1. bootstrap.yml 优先加在,不能被application.yml覆盖
2. application.yml
3. springboot核心注解
@SpringBootApplication用于启动类上,包含@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
4. 自动配置的原理
5. springboot启动时运行特定代码
通过实现ApplicationRunner或CommandLineRunner接口
CommandLineRunner获取命令行参数??
ApplicationRunner获取应用启动的参数
6. springboot读取配置文件的方式
a. @ConfigurationProperties(prefix="info") //用于类上
b. @Value //用于属性上
c. @PropertySource(value={"xxx.properties"}) + @Value //不能支持yml配置
d. @PropertySource(value={"xxx.properties"}) + @ConfigurationProperties(prefix="info")
e. @Autowired
private Enviroment env; //上述的所有配置都可以通过注入Enviroment对象获取
7. springboot支持的日志框架:log4j2、logback(默认)
8. springboot热部署的方式
a. 依赖spring-boot-devtools
9. 多环境配置:启动参数spring.profiles.active
10. 单元测试
@RunWith(SpringRunner.class)
@SpringBootTest //启动测试
//==========================SpringCloud=============================
1. eureka自我保护机制:当eureka server短时间内丢失了过多的实例连接时,节点会进入自我保护模式,保护注册数据,不再删除注册数据;当故障恢复时,自动退出自我保护模式。
2. 什么是熔断?什么是服务降级?
隔离方式:线程池、信号量(默认10)
线程池隔离:请求对象与执行请求的对象解耦,通过线程实现隔离
信号量隔离:控制并发的请求量,防止线程大面积阻塞
熔断:当服务出现某个异常时,直接熔断整个服务,而不是一直等到服务线程超时
回退降级:
a. 执行run时抛出异常
b. 熔断器打开
c. 线程池或信号量超额
d. 命令执行超时
回退降级的方式:
a. fast fail(快速失败):直接抛异常
b. fast silent(无声失败):getFallback返回null或空集合
c. Fallback static:getFallback返回静态默认值
d. Fallback Stubbed: getFallback返回复合对象
3. Hystrix 底层的执行流程和步骤
a. 创建Command(HystrixCommand或HystrixObservableCommand)
b. 调用Command执行方法
hystrixCommand.execute() //同步调用
hystrixCommand.queue() //异步调用,获取Future返回结果
hystrixObservableCommand.observer()
hystrixObservableCommand.toObserver()
c. 检查是否开启缓存。如果开启了缓存并且缓存中有数据,则直接返回;否则,下一步。
d. 检查线程池/信号量是否已满
e. 执行Command
f. 断路健康监测
g. 调用fallback降级
https://blog.csdn.net/qq_25484147/article/details/83375225
https://blog.csdn.net/oldshaui/article/details/90675149
4. 雪崩效应解决方案
a. 硬件故障:多机房容灾、异地多活
b. 流量激增:服务自动扩容、流量控制
c. 缓存穿透:缓存预加载、缓存异步加载
d. 同步等待:资源隔离、MQ解耦
#############################################################################
1. RabbitMq的好处:解耦、异步、削峰
2. RabbitMq中的Broker是什么?
broker是一个或多个erlang node的逻辑分组,并且node上运行着rabbitmq应用
3. 交换器种类:
direct:完全根据routingKey进行路由
fanout:交换器收到消息,广播到所有帮顶的队列上(与routingKey无关)
topic:可以使不同源头的消息路由到同一队列,routingKey支持通配符
header:可以根据数据中的key进行路由
4. 元数据:队列、交换机、绑定关系、vhost的定义
https://www.cnblogs.com/doit8791/p/10328402.html
5. 集群节点类型
磁盘节点:配置信息和元数据信息存储在磁盘上
内存节点:配置信息和元数据信息存储在内存中,性能远大于磁盘
注意:
a. 单节点系统必须是磁盘节点
b. rabbitmq要求集群中至少有一个磁盘节点,否则集群重启后元数据全都会丢失
如果磁盘节点全崩溃后:
a. 不能创建队列、交换器、绑定关系
b. 不能添加用户、更改权限
c. 不能添加和删除集群节点
6. 普通队列与镜像队列
普通队列:消息实体只存在于集群的一个节点上,其他节点上只存储队列的元数据
镜像队列:消息实体存在于集群的所有节点上,并且元数据存在于集群的所有节点;消息实体会主动在镜像队列之间进行同步
#########################################################################
1.Rabbitmq接收到不正确的数据报文时,不断的抛出异常
2.Mysql分页查询时,分页页数比较大时的性能问题
以上是关于面试相关的主要内容,如果未能解决你的问题,请参考以下文章