技术面试一

1. 数据库索引优化(给你一条慢SQL怎么优化)

1.1 使用 explain 分析SQL 语句是否合理
尽量避免 extra 列出现,Using File Sort 、Using Temporary等
1.2 必须被索引
update、delete的where条件系列、order by 、group by、distinct字段,多表 join 字段
1.3 联合索引
对于联合索引来说,如果存在范围查询,比如 between 、<、>等条件时,会造成后面的索引字段失效。
对于联合索引来说,要遵循最左前缀法则,举例来说索引含有字段 id,name,school,可以直接使用id字段,也可以id,name 这样的顺序,但是无法使用 name,school 这样顺序的索引,所以在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。
1.4 强制索引
必要时可以使用force index来强制查询走某个索引:有的时候MySQL优化器采取它认为合适的索引来检索 SQL 语句,但是可能它所采用的的索引并不是我们想要的。这是就可以采用 forceindex来强制优化器使用我们制定的索引。
1.5 日期时间类型
对于非标准的日期字段,例如字符串的日期字段,进行分区裁剪查询时会导致无法识辩,依旧走全表查询,尽量使用 TIMESTAMEP类型,因为其存储空间只需要datetime的一半。
1.6 禁止使用SELECT *
select 只获取必要的字段,禁止使用SELECT * ,这样能减少不必要的消耗(CPU,IO,内存,网络宽带),增加使用覆盖索引的可能性;当表结构发生改变时,表结构变更对前端程序基本无影响。
1.7 避免出现某些字段
SQL 中避免出现 now()、rand()、sysdate()、current_user()等不确定结果的函数。在语句级复制场景下,引起主从复制数据不一致;不确定值的函数,产生的SQL 语句无法使用QUERY CACHE。
1.8 where 字句
避免在where子句中对字段进行null值判断,对于null值的判断会导致引擎放弃使用索引而进行全表扫描,
避免在where子句中对字段进行表达式操作:因为对字段进行了算术运算,这会造成引擎会放弃使用索引。
1.9 like
禁止使用 % 前导查询,例如: like “%abc”,无法利用到索引。
在日常生活中你会发现全模糊匹配的查询,由于MYSQL的索引时B+树结构,所以当查询条件为全模糊时,例如%AB%,%AB,索引无法使用,这时需要通过添加其他选择高度的列或者条件作为一种补充,从而加快查询速度,仅AB%形式的可以避免通配符引起索引屏蔽。
1.10 用 IN 代替 OR
OR 两边的字段中,如果有一个不是索引,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候都会使用IN进行代替,或者使用union all或者是union(必要的时候)的方式代替 ‘OR’也会得到更好的效果,但是SQL语句IN中包含的值不宜过多,应该少于1000 个,过多会使随机IO增大,影响性能。
使用IN是因为MySQL对其做了相应的优化,即将IN中的常量全部存在一个数组中,而这个数组时排序好的,但是如果数值较多,产生的消耗会比较大。
1.11 禁止使用负向查询
例如 not in、!=、<>、not like。
1.12 范围查询
在对字符串类型的索引进行大于运算时,会导致全盘扫描,所以应改为between区间范围运算。
1.13 order by / group by
另外order by /group by 的SQL 涉及排序,尽量在索引中包含排序字段,并让排序字段的排序顺序与索引列中的顺序相同,这样可以避免排序或者减少排序次数,如果排序字段没有用到索引,就尽量少排序。
1.14 禁止使用 order by rand()
order by rand() 会为表增加几个伪列,然后用 rand()函数位每一行数据计算rand()值,最后基于该行排序,这通常都会生成磁盘上的临时表,因此效率非常的低,建议先使用rand()函数获得随机的主键值,然后通过主键获取数据。
1.15 尽量用union all 代替 union
两者的差异主要是前者需要将结果集合并后在进行唯一性过滤操作,这会涉及到排序,增加大量的CPU 运算,加大资源消耗和延迟,当然,union all 的前提条件是两个结果集没有重复数据
1.16 减少与数据库的交互
尽量采用批量SQL语句,减少与数据库交互次数。
获取大量数据时,建议分批次获取数据,每次获取数据少于5000条,结果集应少于1M
1.17 简单查询还是复杂查询
不要用一个SQL 解决所有事情,可以分步骤做,省时,易理解,优化。且 MySQL也十分擅长做处理简而短的SQL ,总体耗时会更短,也不会产生臃肿的SQL ,让人难以理解和优化。
拆分复杂的SQL为多个小SQL,避免大事务。简单的SQL容易使用到MySQL的QUERY CACHE ;减少锁表时间特别是MyISAM;可以使用多核CPU
1.18 删除全表数据
delete from table_name;会产生大量的undo和redo日志,执行时间很长,可采用 TRUNCATE TABLE table_nam.
1.19 字符集问题
col_utf8mb4=col_utf8关联类型都是varchar,但字符集不同,无法使用索引。使用过程中要特别注意。
1.20 count优化
「优化思路」 : 是选择索引 key_len 最短的二级索引效率高,不要使用全表扫描(PK 聚族索引会全表扫描),因为索引 key_len 越短,读取页面越少,进而 IO_COST 越小。
小结
大量的更新/删除操作需要控制频度,例如:每秒操作2000行以下

使用 prepared statement 和绑定变量,可以提升性能并避免 SQL 注入

程序应有捕获 SQL 异常的处理机制,必要时通过 rollback 显示回滚

尽量少使用 distinct、order by、group by、union 等 SQL,排序需求可以放到前端(分页的就不方便交给前端排序)。

大事务或者长查询的需求根据业务特点拆分

杜绝程序中在处理事务时夹杂 RPC,会造成资源长时间不释放。有很多锁超时、并发数上涨都是由于事务中有 RPC 造成的。

关注软件本身的优化同时,也需要关注硬件的性能指标和优化,以及硬件的发展方向。MySQL 属于 IO 密集型的应用,对存储硬件的 IO 性能要求比较高,在高并发的场景中,建议使用 PCI-e。
「重点总结一下」:SQL 的执行过程->查询优化器的工作原理->SQL 执行计划的解读->MySQL 慢查询日志和分析->SQL 常用的优化手段->SQL 编写规范->深入实际业务对数据库访问进行优化。
原文链接:https://blog.csdn.net/MobiusStrip/article/details/110913814
2. 怎么判断索引是否失效
3. 怎么写悲观锁的SQL
4. 悲观锁和乐观锁的场景
5. SQL的执行计划
6. b+树是如何进行范围查询
7. 如果为了提高读取速度,查询数据使用的是redis,那么Redis和mysql同步数据设置的时长是多少,那么在同步数据之前这段时间新增数据就查不到了这个问题怎么解决
8. redis缓存与数据库不一致怎么办,数据库主从结构读写分离之间存在时间间隔,加入缓存后主从之间复制时间更大了,怎么解决
9. SpringSecurity是怎么鉴权的,整个流程是怎么样的,你在项目中怎么实现的。
10. 你在项目中哪些地方有用到过Aop?Aop有哪几种实现方式?
11. 我看你项目中有写到过使用Redis,说说你主要用了Redis实现了什么功能。
12. 你有了解过微服务吗,谈谈你对它的理解,项目中怎么使用的。
13. 你在项目中遇到过哪些困难,你是怎么解决的。
14. 你在项目中有做过SQL优化吗,谈谈SQL优化的思路
15. Seate的底层你了解吗?
16. 用redis做分布式锁的话,你怎么看?
17. 数据库优化你有经验吗?
18. redis的使用除了缓存还能做什么?
19. .rabbitMQ 和 kafka的区别,因为他们公司用的kafka.kafka是点对点,点对面,rabbitmMQ更加灵活
20. rabbitMQ怎么保证消息不丢失?–我从3个方面回答的,消息的确认到达回调方法(到达路由、到达队列那个),消息持久化,手动ACK
21. 你在公司有自己搭建和部署经验吗?,docker-compose
22. redis你是用哪种数据结构干什么的?list,还是string?–我们项目中的教学模块存储课程表是hash,其他简单的热门商品名称的话,用string
23. 最后简单的来个基础题吧,讲讲你对hashmap的认识?–大家都懂,16,64,8,6,0.75
24. hashmap的put方法在计算到相同哈希值时,是会调用什么方法进行判断和存储–equals
25. mybatis可以延迟加载吗,它的底层原理是什么
26. 您了解ssm框架吗?说说和SpringBoot两者的区别
27. springboot为什么那么方便?
28. eurek和nacos的区别
29. 项目中多线程的使用
30. 了解threadlocal吗?
31. 惯例,arraylist和hashmap
32. 了解哪些安全的集合吗?
33. redis的使用场景
34. 您自己部署过公司项目吗
35. 怎么部署springboot工程,它打包完成是jar包还是war包
36. nacos的负载均衡的算法了解吗?还有它的实现原理。
37. mysql的默认隔离级别是什么
38. 你了解什么索引,索引的使用场景,什么时候用什么索引
39. 了解linux吗?怎么找出内存占用最多的进程,指令
40. 怎么分配内存,比如一个服务器上有4个项目在运行,防止内存溢出
41. 忘了。。。好多。。。和部署相关的,内存分配的问题
42. 备份问题、持久化问题
43. 集群怎么用,部署了几台服务器
44. 除了做缓存,还可以做什么
45. 幂等性问题
46. RabbitMQ
1.基础使用
2.如何保证消息可靠性
3.消费信息的队列其它问题
47. Shiro:
1.登录认证流程
2.JWT使用
48. SpringMVC的工作流程;
49. 注册中心用的什么
50. 网关用的什么
51. 讲一下通过哪些途径了解当下的主流技术
52. 讲一下对新技术的调研(问题具体不记得了,当时答的时候回答是看下这个技术是做什么用的,解决的什么问题,对比类似技术的优缺点等等)
53. JVM中类加载的步骤
54. 谈谈垃圾回收机制
55. 多线程怎么开启?假设开启了A、B线程,线程结束后怎么开启C线程?
56. hashmap和hashtable区别
57. 谈谈AOP的理解
58. Session共享
59. SpringCloud和SpringBoot的关系
60. SpringBoot自动装配原理
61. Mybatis怎么使用?Mybatis缓存?
62. Redis持久化、Redis主从复制
63. 为什么你的项目选择Kafka而不是其它呢
64. 问项目技术栈及具体使用
65. 用SpringSecurity做登录认证是怎么实现的?
66. redis如何做关注和收藏的;
67. redis有哪几种数据类型,以及它们的使用;
68. 缓存穿透如何解决;
69. RabbitMQ的优点;
70. ES的倒排索引;
71. Springboot中做监听器如何做;
(1).实现ApplicationListener接口
(2).自定义listener类,提供监听的方法processAccountCreatedEvent(方法名可以自定义),接受一个自定义的event事件作为参数,同时添加注解 @EventListener
72. Springboot如何做参数校验;
73. Springboot中用来接收前端传来的参数,主要用到哪些注解,区别是什么
74. Spring中有哪几种注入容器的方式
75. 在linux中如何查看错误信息,会用到什么指令,如何查看tomcat的错误信息
tail -f
76. 查看进程的命令
77. hashmap底层原理
78. treemap和haspmap的区别
79. 创建线程的方式
80. 调用start方法和直接调用run方法的区别
81. spring AOP的理解,AOP的应用场景
82. 为什么说mybatis是一个半ORM框架
83. mybatis的缓存
84. #和$的区别
85. SpringBoot的理解,自动装配原理
86. 项目中的难点
87. 微服务了解哪些组件
88. 网关除了同一地址有了解其他的吗,像鉴权、过滤器
89. RabbitMQ有了解吗,项目中有用过吗
90. MySQL有经常用吗
91. (现在有张学生表,三个属性)写出年龄在17-35岁且成绩>85的SQL语句
92. 如果要把学生年龄正序,成绩倒叙怎么写
93. 如果查出三个重复的成绩怎么弄
94. 平时有自学什么吗
95. SpringCloud 有哪些组件?
96. ElasticSearch原理是什么?你怎么进行使用搜索的。
97. 你在项目中使用过RabbitMQ主要的业务场景是什么?
98. 你对索引了解吗,谈一谈你对索引的了解。
99. 你做过哪些SQL优化,说一说你怎么优化的
100. Java中的锁你有知道哪些?(我就讲了两个,Synchronize 和重入锁)
6.1 谈一谈Synchronize 底层原理
6.2.谈一谈重入锁 的底层原理
101. Redis 有哪几种数据结构?(我答了5种分别是什么,然后他问,只有5种吗?我沉思了一下,我说只有知道5种。其实应该还有3种,我没答出来)
102. 你简历中有写过熟悉Docker ,你说一下怎么进入Docker 下安装的镜像。
103. 使用Linux怎么查看当前系统运行的日志?不用cat 不用vi
104. 使用linux在查看日志的时候怎么使用关键字去查看
105. Object 类有哪些方法(我就答了两个)
106. SpringBoot中有哪些常用的注解?(我讲了好些个注解 ,然后还讲了Springboot注解,想引导面试官问我Springboot加载流程,失败了。)
107. Springboot 中你有用过测试吗,用了哪些注解。
108. 你谈谈你对乐观锁和悲观锁的了解,在MySQL中怎么去实现。
109. 你在工作中有使用过线程池吗?我答了有了解过一些,没有使用过。
110. 线程池中有哪些参数(我盲猜了两个,还不知道对不对) 。。。
111. 线程有哪些状态?我答了5个 16.1线程的等待状态需要怎么去唤醒,除了Notify(),和NotifyAll
112. RabbitMQ解决消息幂等性除了使用判断消息ID是否被消费过还有其他的方法没有。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值