sql调优
-
explain执行计划查看sql的执行效率
-
频繁查询时使用索引
-
对于频繁join的sql,可以使用视图,提高查询速度
-
SQL语句中IN包含的值不应过多,否则会影响应性能,能用between就不用in
-
去重distinct过滤字段要少,否则影响性能
-
尽量用union all代替union,union有唯一性过滤操作,这就会涉及到排序,影响性能,使用union all的前提是两个结果集没有重复数据
-
先过滤,后分组可以提高groupby的效率
-
选择合理的字段类型,能用数字类型就不用字符串,字符串处理速度比数字类型慢; 尽量用小类型,比如:用bit存布尔值,用tinyint存枚举值等; 长度固定字符串用char,不固定用varchar
-
使用左连接时,左边表数据结果尽量小,条件尽量放到左边处理,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优
-
批量提交可以提高性能,例如:
不能批量删除太多数据,会造成锁表:
注意一些索引失效的情况
索引失效的情况
1、带有运算
2、使用函数
3、使用%XXX左模糊查询,因为mysql是最左原则,使用XXX%右模糊查询是可以使用索引的,但是左模糊违背了最左原则所以不行
4、使用范围运算,not in,in > ,<都不行
5、查询的字段不是索引的最左字段,同样是因为最左原则
6、字段类型不匹配,常见的隐式数据类型转换,mobile=1356不会走索引,会转换为字符串可以查询但是,mobile='1356’会走索引
7、or条件左边的是索引字段,右边的不是。也不会走索引,因为or是一个并集
关于基本类型,包装类型之间的那些事
关于七种基本类型之间的转换:大类型可以接受小类型,小类型不可以接受大类型,需要强转;而对于同一种类型的包装类和基本类型:直接自动拆装箱,如果要手动转换,方法为:Integer =Integer.valueOf(int) int=Integer.intValue(Integer)
包装类型之间的转换:例如 Integer------>Short
Integer a=3 Short s=4;
a=s.intValue();s=a.shortValue(); 该操作会把他转换成对应的基本类型,然后自动拆装箱成包装类型
GC相关
一.如何判定垃圾数据
1.引用计数法
会产生对象间的相互循环引用的问题。
2.可达性分析法(主流)
判断对象与GC ROOTS是否有相连的引用链,如果没有,则是垃圾对象,这样可以解决对象间的相互循环引用的问题。
二.垃圾回收算法
1.Mark-Sweep标记-清除算法(新生代回收)
优点:回收效率高,速度快
缺点:会产生大量的不连续的内存碎片,要是想分配一个大对象,没有连续的内存地址空间,就会触发FULL GC
2.Mark-Compact标记-整理算法(老年代回收)
2.Copying算法(新生代回收)
伊甸园区没有被gc的数据会转移到幸存区,下一次gc的时候会清理伊甸园区和一个幸存区,伊甸园区和幸存区都没有被回收的数据会转移到另一个幸存区,也就是说始终有一个幸存区是空的,幸存区中连续8次没有被gc的数据会被转移到老年代,如果老年代也满了,就会触发大gc。
三.GC收集器
1.Serial系列收集器:
单线程收集器,会产生停顿
2.ParNew收集器
多线程收集器,用于收集新生代的垃圾数据
3.CMS收集器
并发低停顿收集器,用在希望系统停顿时间短,延迟低的系统上。;典型应用:HBase
4.Parallel系列收集器
即可以回收新生代,又可以回收老年代,多线程收集器,不关心每次回收的停顿时间长短,而是关心每次回收的吞吐量;典型应用:Hadoop,Spark默认使用这种GC收集器
5.G1收集器(最新)
结合CMS和Parallel的优点,既要低停顿,又要高吞吐。内部将堆划分为一个个的小区域块,每个区域块根据功能被标记为:伊甸园区,幸存区,老年区