目录
昨日总结
今日计划
JVM
SQL优化
插入数据的优化
主键优化
数据组织方式
主键设计原则
Order by排序优化
Gruop by分组优化
limit分页查询优化
count聚合函数的优化
update的优化
昨日八股答案
今日八股
昨日总结
- JVM底层原理学习(26%),学习mysql进阶篇(51%),学习函数式编程(15%)
- cv(停滞中)
- 小林coding–Spring面试篇(2/7)
- 码随想录——……
今日计划
- JVM底层原理学习,学习mysql进阶篇,学习函数式编程
- cv(停滞中)
- 小林coding–Spring面试篇(3/7)
- 码随想录——最大二叉树
JVM
- 元空间和永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
- jdk8以后方法区的变化:无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中
- 永久代为什么要被元空间替代:为永久代设置空间大小时很难确定的,同时对永久代进行调优是很困难的
- 方法区的垃圾收集主要有两部分内容:常量池中废弃的常量和不再使用的类型
- 为什么将字符串常量池放在堆中:因为永久代的回收效率很低,在full gc(即老年代空间不足时才触发),而开发中会有大量的字符串被创建,这就导致回收效率低。如果放在堆中,能及时回收内存
SQL优化
插入数据的优化
批量插入
Insert into tb_test values(1,'tom'),(2,'cat'),(3,'jerry');
手动提交事务
start transaction;//开启事务 Insert into tb_test values(1,'tom'),(2,'cat'),(3,'jerry'); … commit; //提交事务
主键顺序插入(取决于mysql的组织结构)
逐渐乱序插入 8 1 3 88 2 33 22 逐渐顺序插入 1 2 3 4 5 6 7 88 145
大批量的插入数据(采用load指令)
主键优化
数据组织方式
在InnoDB存储引擎中,表数据都是根据逐渐顺序组织存放的,这种存储方式的表称为索引组织表 。如果主键乱序插入,可能会发生页分裂。删除记录时,会标记记录,当某页中的记录达到一半被标记删除时,会向左右找合适的页进行合并,发生页合并现象
主键设计原则
- 满足业务需求的情况下,尽量降低主键的长度
- 插入数据时,尽量选择顺序插入
- 尽量不要使用UUID做主键或是其他自然主键,如身份证号
- 业务操作时,避免对主键的修改
Order by排序优化
总结
- 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则
- 尽量使用覆盖索引
- 多字段排序,一个升序一个降序,注意联合索引在创建时的规则(ASC/ DESC)
- 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区的大小
Gruop by分组优化
- 在分组操作时,可以通过索引来提高效率
- 分组操作时,索引的使用也是满足最左前缀法则的
limit分页查询优化
对limit 20000000,10, 此时需要mysql排序前20000010记录,仅仅返回20000000-20000010的记录,其他的记录丢弃,查询排序的代价非常大。
优化思路:
一般分页查询时,通过创建覆盖索引能够比较好的提高性能,可以通过覆盖索引加子查询形式进行优化
count聚合函数的优化
由于count的存储引擎,InnoDB执行count时候,需要把数据一行一行的从引擎里面读出来,然后累计计数
优化思路:自己设计计数(比较复杂)
count的几种用法
按照效率排序的话,count(字段)< count(主键id) < count(1) ≈ count(*),所以尽量使用count(*)
update的优化
只有通过索引条件检索的数据,InnoDB才会使用行级锁。
不通过索引条件查询时,InnoDB会对表中的所有记录加锁,实际效果跟表锁一样。
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁,升级表锁,并发性能会大大降低
昨日八股答案
-
动态代理是什么
代理是一种常用的设计模式,是为其他对象提供一个代理以控制对某个对象的访问,将两个类的关系解耦。
动态代理是一种在运行时动态创建代理对象的机制,主要用于在不修改原始类的情况下对方法调用进行拦截和增强。主要有JDK动态代理(基于接口的代理)和CGLIB动态代理(基于类的代理)
-
动态代理和静态代理的区别
静态代理:由程序员创建或者由特定工具创建,在代码编译时就确定了被代理的类是一个静态代理。静态代理通常只代理一个类,当由n个业务时,需要n个静态代理,不利于业务的扩展
动态代理:在代码运行期间,运用反射机制动态创建生成,它代理的是一个接下的多个实现类。一个代理类服务于所有对象。
-
AOP实现有哪些注解
- @Aspect:用于定义切面,标注在切面类上。
- @Pointcut:定义切点,标注在方法上,用于指定连接点。
- @Before:在方法执行之前执行通知。
- @After:在方法执行之后执行通知。
- @Around:在方法执行前后都执行通知。
- @AfterReturning:在方法执行后返回结果后执行通知。
- @AfterThrowing:在方法抛出异常后执行通知。
- @Advice:通用的通知类型,可以替代@Before、@After等。
-
什么是反射
反射机制是指程序在运行状态下,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法。也就是说,Java 反射允许在运行时获取类的信息并动态操作对象,即使在编译时不知道具体的类也能实现。
今日八股
- Spring如何解决循环依赖的
- Spring常用的注解
- Spring的事务在什么情况下会失效
- Bean的生命周期、
评论前必须登录!
注册