数据库索引续
在 上一篇 文章中,我们介绍了几种可以作为索引的数据结构,并指出了它们的适用场景,随后又分析了 InnoDB 索引的数据结构模型。今天我们继续来聊聊跟 MySQL 索引相关的概念。
提到数据库索引,我们并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,我们可能就会说『给某个字段加个索引吧』之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就一起来聊聊这个话题吧。
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务是在引擎层实现的。虽然 MySQL 是支持多引擎的系统,但不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。
假设你有个最简单的表 test,表里只有一个 id 字段,在执行 select * from test where id=3
这个查询语句时。我们只看到『输入一条语句,返回了一个结果』,却不知道这条语句在 MySQL 内部的执行过程。所以今天我想和你一起把 MySQL 拆解一下,看看里面都有哪些『零件』。
我们知道,数据结构和算法本身解决的是『快』和『省』的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这就是我们今天要介绍的内容:时间、空间复杂度分析。
因为 Java 代码到机器码之间还存在着字节码,所以 Java 语言的『编译期』其实是一段不确定的过程。它可能是指一个前端编译器把 *.java
文件转变成 *.class
文件的过程;也可能是指虚拟机的运行期编译器(JIT 编译器,Just In Time Compiler)把字节码转变成机器码的过程;还可能是指使用提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java
文件编译成机器码的过程。
JVM 在 new 一个对象的时候,会先查看对象所属的类有没有被加载到内存。如果没有的话,就通过类的全限定名来加载,等类加载完成之后,再创建对象。总的来说, new 一个对象可以分为两个过程:类加载和创建对象。
前文介绍了常见的对象存活判定算法和垃圾收集算法,Java 虚拟机实现这些算法时,必须对算法的执行效率有严格的考虑,才能保证虚拟机高效运行。下面我们来看看 HotSpot 虚拟机的具体实现。