MySQL索引设计原则
代码先行,索引后上一般应该等到主体业务功能开发完毕,把涉及到该表相关sql都要拿出来分析之后再建立索引。
联合索引尽量覆盖条件设计一个或者两三个联合索引(尽量少建单值索引),让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原 则。
不要在小基数字段上建立索引索引基数是指这个字段在表里总共有多少个不同的值,比如一张表总共100万行记录,其中有个性别字段, 其值不是男就是女,那么该字段的基数就是2。如果对这种小基数字段建立索引的话,还不如全表扫描了,因为你的索引树里就包含男和女两种值,根本没法进行快速的二分查找,那用索引就没有太大的意义了。一般建立索引,尽量使用那些基数比较大的字段,就是值比较多的字段,那么才能发挥出B+树快速二分查找的优势来。
长字符串我们可以采用前缀索引尽量对字段类型较小的列设计索引,比如说什么tinyint之类的,因为字段类型较小的话,占用磁盘空间也会比较小,此时你在搜索的时候性能也会比较好一点。当然,这个所谓的字段类型小一点的列,也不是绝对的,很多时候你就是要针 ...
使用jolcore库查看Java对象大小
对象大小可以用jolcore包查看,本篇介绍jolcore的基本使用
引入依赖12345<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version></dependency>
具体使用12ClassLayout layout = ClassLayout.parseInstance(new Object());System.out.println(layout.toPrintable());
测试代码1234567891011121314151617181920212223242526import org.openjdk.jol.info.ClassLayout;public class JOLSample { public static void main(String[] args) { ...
java中的类加载器
java中的类加载器主要有三种:引导类加载器扩展类加载器应用类加载器
通过代码了解类加载器1234567891011121314151617181920212223242526272829303132public class TestJDKClassLoader { public static void main(String[] args) { //打印类加载器 System.out.println(String.class.getClassLoader()); //不是java对象,打印null System.out.println(DESKeyFactory.class.getClassLoader()); System.out.println(TestJDKClassLoader.class.getClassLoader()); //类加载器之间的关系 System.out.println(); ClassLoader appClassLoader = ...
java程序启动时都发生了什么
本文主要介绍在我们执行java -jar xxx.jar时都发生了什么,附框图。
当我们执行这个命令时:
java命令会去调用jvm.dll来创建java虚拟机
java虚拟机创建一个引导类加载器,并使用它加载sun.misc.Launcher类
Launcher类创建一些其他的类加载器,比如appclassloader,随后appclassloader会去加载Main.class类。 其中main class是从jar包中的MANIFEST.MF文件找到的。
加载的过程如下:
首先把类从硬盘加载到jvm内存,具体是在方法区
然后对类进行验证,主要是验证这个类的字节码是否符合Java的规范,比如某个字节放Java的主版本,次版本,某个字节放类的常量个数等。
之后进行准备,主要是对类内的静态变量分配内存并赋予默认值.
随后进行解析,把类内部的符号变量替换为一些静态地址.
最后进行初始化,对静态变量赋予初始值。
个人理解:类加载过程就是读取.class文件到内存中,将其放在方法区内,然后在Java堆区创建一个java.lang.Class对象,通过Class对象来访 ...