云计算百科
云计算领域专业知识百科平台

Java,八股,cv,算法——双非研0四修之路day31

目录

昨日总结

今日计划

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的生命周期、

赞(0)
未经允许不得转载:网硕互联帮助中心 » Java,八股,cv,算法——双非研0四修之路day31
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!