关于锁还有两个被经常提到的概念,就是阻塞和死锁,我发现开发人员会经常混淆,两种错误,
所以我觉得有必要在这里强调一下,两个锁的问题,首先什么是阻塞呢,阻塞是因为不同锁的兼容性的关系,
在有些时刻,一个事务中的锁,需要等待另一个事务锁的释放,他所占用的资源,这就形成了阻塞,比如我们前面
演示的表级锁时,第一个表对应myinnodb加了表级锁,所以第二个连接要在表上加共享锁呢,等待第一个表的排他锁
释放,这样第一个表的连接阻塞第二个连接,阻塞是为了确保事务的可以并发,且正常的运行,但是当一个系统中出现
大量的阻塞,往往就意味着系统中存在问题,也许在一个频繁更新的表上出现了慢查询,或许是一些其他的管理操作,
如alter table表备份时,频繁的加上排他锁,而过多的阻塞绝对不是一个好的现象,占用大量的系统资源,使得系统的
性能整体的下降,那我们下来再来看看什么是死锁,死锁是指两个或者两个以上的事务,在执行过程中,相互占用对方
产生的资源,而产生一种异常,从定义中可以看到,处在阻塞中的多个事务呢,占用了被阻塞事务的多个资源,而死锁是
占用对方的资源,这就是阻塞和死锁最大不同之处,另外一点不同呢,死锁数据库会自动发现,并且在多个死锁的事务中,
选择一个占用资源最小的事务呢,来进行回滚操作,这样就可以使其他事务呢,正常运行了,死锁是可以由系统自动处理的,
如果只有少量的死锁,并不会对系统产生什么样的影响,只要在应用程序中发现死锁并进行处理就可以了,但是如果一个系统中
频繁的出现大量的死锁,这时就需要留意了,通常情况下死锁可以通过在多个事务中,按照相同的顺序访问相同的资源,来解决,
关于具体如何处理死锁下面会有介绍,这里只是给大家强调一下,阻塞和死锁是不同的,希望大家以后不要再混淆这个概念了
我们再来看一看除了锁以外,Innodb其他特性,Innodb相对于其他引擎不同之处呢,还有一点就是,提供了一个独特的
性能监控工具,这个工具就是show engine innodb status命令,这个show命令呢,输出内容包含了一些平均值统计信息,
对于平均值呢,就是上次输出结果后生成的统计数,如果想要使用show engine innodb status这个统计信息的话,那就要
确保在两次输出之间至少要间隔30秒左右的时间,以便有足够长的收集时间,进行多次采样,还要说明的一点是,不同版本的
innodb status的输出呢,会有些不同,这里我使用的是MYSQL5.6的版本,我就以这个版本为例来给大家简单的介绍一下,如何
使用show engine innodb status这个命令,这个命令输出内容比较多,所以我们就到演示系统中来做一个简单的了解,下面我们
就进入到我们的演示系统,来看一下show engine innodb status具体输出是什么样子的
show engine innodb status \G
这里就是show engine的具体输出了,首先我们来看一下第一部分的信息,是多长时间的一个统计,最近33秒,
就是最近33秒的一个平均值,还显示了后台进程的进程信息,包括innodb的主进程,他的循环次数,还有一些sleep的次数,
刷新的次数,这个演示系统是没有任何负载的系统,所以看到他的循环是非常少的,只有一些信号的信息了,首先这些信号
信息就包括一些等待信息啊,包括一些等待的信息
再接下来呢,事务信息,同样由于我们的演示系统是没有任何负载的,我们可以看到一个事务id,就是我们刚才
show engine innodb status的这个连接,这个线程所执行的一个事务,接下来就是关于一些文件IO的信息,
包括写,Innodb的读写进程
innodb的读写进程,我在配置文件中也配置了很多,大家可以看到很多的读写进程,在默认情况下呢,4个读进程,
4个写进程的,那么接下来就是一些缓存信息,包括insert buffer and hash索引的信息,这里就显示了他的插入缓存,
一些尺寸,以及合并的操作信息
大家可以看到呢,几乎都是0,因此我们这张表是没有任何负载的,没有任何操作
下面就是一些log信息了,以及检查点的一些信息,证明了我们的演示系统呢没有任何负载,没有事务的,
下面就是一些缓存池的信息,这个就代表了总的内存分配,以及附加缓存池的信息,可以看到,下面就是一些行的操作
信息,以及大家看到这里有一个插入的行只有24行,读有66行,但是在一个生产环境系统中呢,统计值不应该是这个样子的,
他们都应该代表了一组数据,同时对于生产系统中呢,show engine innodb status呢,它会输出更多的内容,比如死锁信息,
比如外键的错误信息,等等,如果大家对Innodb status感兴趣的话,MYSQL的官方手册,这里就不做过多介绍了
前面我们介绍了Innodb存储引擎的特性,那么下面我们来看看Innodb引擎的适用场景,从上面的介绍呢,
可以看到,Innodb存储引擎呢,可以应用到大多数的在线处理,和应用场景中,从前有一种观点,认为只有
事务支持时呢,才需要Innodb存储引擎,其实从上面的介绍呢,可以看出来,实际上无论是否需要事务支持,
我们都应该使用Innodb存储引擎,其中所说的特殊功能呢,可能就包括我们之前在介绍MYISAM中说过的,
全文索引这些,由于在MYSQL5.7之前,只支持MYISAM存储引擎,所以如果我们要使用MYSQL存储这类数据的话呢,
可能只能选择MYISAM存储引擎了,可是这种情况呢,在MYSQL5.7版本之后呢,已经有了改变,在MYSQL5.7版本之后呢,
Innodb已经可以支持全文索引,和空间函数了,所以呢对于这类应用呢,也完全可以使用Innodb存储引擎来进行存储了,
Innodb和MYISAM是MYSQL最常用的两种存储引擎,另外还有一些特殊功能的存储引擎,在一些场景下呢,我们下面主要介绍
一下,其中比较常用的存储引擎,CSV