Innodb是mysql常用存储引擎,5.5版本以后更是成为mysql数据库的默认存储引擎,
Innodb具有哪些特性呢?
1、Innodb是一种事物型存储引擎
完全支持事物的ACIS特性
关于事物之前我们已经讲过,那这里我们着重讲解如何实现事物的 ACID特性:
为了实现事物的原子性、一致性和持久性,Innodb实现了两个特殊的日志类型,即Redo Log(重做日志)和Undo Log(回滚日志)。
其中Redo Log主要是为了实现事物的持久性,由两部分组成:
(1)、内存中的重做日志缓冲区,由innodb_log_buffer_size决定大小
(2)、重做日志文件,即文件系统中id_log_file开头的文件。
Undo Log专注未提交事物进行回滚和实现MVCC(多版本并发控制)
Redo Log存储已提交事物,Undo Log存储未提交事物。
因此当我们对Innodb表进行修改,不仅会产生Redo Log,也会产生一定Undo Log,这样用户提交对语句由于某种原因失败,或者用户使用ROLLBACK语句回滚,这样就可以用利用Undo Log中信息。
Redo Log基本是顺序写入,数据库运行时不需要对Redo Log进行读取操作。
Undo Log需要随机读写,mysql5.6版本中的Undo Log可以独立于系统表空间存在,如果条件允许,我们就可以把Undo Log存储在固态存储设备上,这样可以由更好的性能。
2、Innodb支持行级锁
这点与myisam支持的表级锁不同。行级锁的特点是进行写操作时需要锁定资源更多,支持的并发更多。但是需要注意的是Innodb行级锁是在存储引擎层实现的,mysql服务器完全不了解锁的实现方式。
那锁的作用是什么呢?什么是锁呢?
锁是数据库系统区别于文件系统的一个重要特性,锁的主要作用是管理共享资源的并发访问,锁用于实现事物的隔离性。
锁的类型?
共享锁(读锁)
独占锁(写锁)
锁的粒度
锁的粒度也就是锁的策略,也就是被加锁资源的最小单位。
表级锁
这是mysql基本的表策略,也是开销最小的策略,但也意味着并发性低,一个用户对表进行写入前需要先获得写锁,但会阻塞其他用户对该表对所有对读写操作。只有没有写锁对情况下,其他用户才会会的读锁,读锁相互间不会堵塞。
表级锁通常是在mysql服务器层实现,所以虽然Innodb实现了行级锁,但是在一些时候,在mysql服务层还是会对Innodb表加入表级锁。
行级锁
行级锁可最大程度支持并发处理,当然锁对开销也比表级锁大,行级锁只在存储引擎中进行实现。