/images/avatar.png

MySQL性能调优(4)Innodb存储引擎的事务

事务

数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务是一组不可再分割的操作集合(工作逻辑单元);

MySQL中如何开启事务:
1
2
3
begin / start transaction -- 手工
commit / rollback -- 事务提交或回滚
set session autocommit = on/off; -- 设定事务是否自动开启
JDBC编程开启事务
1
2
3
connection.setAutoCommit(boolean);
true:sql命令的提交(commit)由驱动程序负责 
false:sql命令的提交由应用程序负责,程序必须调用commit或者rollback方法// connection.commit()
事务的ACID特性
  • 原子性(Atomicity)

最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚

  • 一致性(Consistency)

事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致

1
2
原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。
而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。
  • 隔离性(Isolation)

一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)

  • 持久性(Durability)

事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失

JVM初始化顺序

类的静态成员 –> 类的实例成员 –> 类的构造方法 说到这里,有一个很好的问题。比如一个类中静态变量是一个该类的实例,那么此时类的初始化顺序是什么样的呢?

昨天在群里看到这个问题,很有趣,今天来分析一波

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class test {
    public static test  t1=new test();
    {
        System.out.println("执行1");
    }
    static
    {
        System.out.println("执行2");
    }
    public static void main(String[] args) {
        test t2=new test();
    }
}

MySQL性能调优(2)存储引擎介绍、体系结构及运行机理

存储引擎介绍

  • 插拔式的插件方式(存储引擎本身是数据库服务器的组件,负责对在物理服务器层面上维护的基本数据进行实际操作)
  • 存储引擎是指定在表之上的,即一个库中的每一个表都可以指定专用的存储引擎
  • 最新的MySQL 8.0 发布之后,对数据库数据字典方面做了较大的改进。

首先是,将所有原先存放于数据字典文件中的信息,全部存放到数据库系统表中,即将之前版本的.frm,.opt,.par,.TRN,.TRG,.isl文件都移除了,不再通过文件的方式存储数据字典信息。 其次是对INFORMATION_SCHEM,MySQL,sys系统库中的存储引擎做了改进,原先使用MyISAM存储引擎的数据字典表都改为使用InnoDB存储引擎存放。 从不支持事务的MyISAM存储引擎转变到支持事务的InnoDB存储引擎,为原子DDL的实现,提供了可能性。

1
2
// 查看数据库当前支持的存储引擎
show engines;

MySQL性能调优(3)查询优化详解

查询执行路径

##### MySQL 客户端/服务端通信 - MySQL客户端与服务端的通信方式是“半双工”; - 客户端一旦开始发送消息,另一端要接收完整个消息才能响应。客户端一旦开始接收数据没法停下来发送指令。 - 对于一个MySQL连接,或者说一个线程,时刻都有一个状态来标识这个连接正在做什么 - 查看命令 show full processlist / show processlist 我正在通过navicat向虚拟机里面的数据库导入数据 ``` Sleep 线程正在等待客户端发送数据 Query 连接线程正在执行查询 Locked 线程正在等待表锁的释放 Sorting result 线程正在对结果进行排序 Sending data 向请求端返回数据 可通过kill {id}的方式进行连接的杀掉 ``` [官网状态全集](https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html)
查询缓存
  • 前话:为什么MySQL默认关闭了缓存开启??

MySQL 8.0不支持查询缓存,用户升级后将被鼓励使用服务器端查询重写或ProxySQL作为中间缓存。

LinkedList真的是查找慢增删快吗

以前别人面试我,这个问题的时候我一般都是回答:linkendlist增删改块,arraylist查找块。直到最近我看了掘金的一篇博文,才发现,实践出真知啊。

测试结果

分别在ArrayList和LinkedList的头部、尾部和中间三个位置插入与查找100000个元素所消耗的时间来进行对比测试,下面是测试结果

List插入查找
ArrayList头部2859ms7ms
ArrayList尾部26ms12ms
ArrayList中间848ms13ms
LinkedList头部15ms11ms
LinkedList尾部28ms11ms
LinkedList中间15981ms34928ms