ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面试相关

2019-12-27 23:01:19  阅读:162  来源: 互联网

标签:事务 索引 面试 InnoDB MyISAM 相关 线程 数据


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分页查询时,分页页数比较大时的性能问题

标签:事务,索引,面试,InnoDB,MyISAM,相关,线程,数据
来源: https://www.cnblogs.com/wuan90/p/12109984.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有