MyISAM和InnoDB存储引擎的特点

Mysql区别于其他数据库的一个重要特点是其插件式的表存储引擎,注意,存储引擎是基于表的,而不是基于数据库。

MyISAM

特性

 

不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用

表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能

读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读

只会缓存索引:MyISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据

适用场景

不需要事务支持(不支持)

并发相对较低(锁定机制问题)

数据修改相对较少(阻塞问题)

以读为主

数据一致性要求不是非常高

InnoDB

特性

具有较好的事务支持:支持4个事务隔离级别,支持多版本读

行级锁定:通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响

读写阻塞与事务隔离级别相关

具有非常高效的缓存特性:能缓存索引,也能缓存数据

整个表和主键以Cluster方式存储,组成一颗平衡树

所有Secondary Index都会保存主键信息

与myisam相比Innodb存储引擎支持事务,支持行锁和外键,支持非锁定读(默认读操作不会产生锁)。还可以通过MVCC(多版本并发控制)来获得高并发性,实现了标准的4中隔离级别,默认为Repeatable read级别。还通过next—key Locking的策略来避免幻读(phantom)现象的产生,Innodb还支持插入缓存(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等功能。

Innodb中每张表的存储都是按照主键的顺序进行存放的,如果没有定义主键,Innodb会为每一行生成一个6字节的ROW ID,以此作为主键。

适用场景

需要事务支持(具有较好的事务特性)

行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成

数据更新较为频繁的场景

数据一致性要求较高

硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO

Innodb的关键特性

插入缓冲(insert buffer)

在InnoDB中,若主键(插入聚集索引Primary Key)自增,那么在页中存储时,会按主键顺序的存放,所以数据是集中的,大部分在一页中,这样会减少磁盘的离散读取,提高速度。
然而,当索引不唯一时,就需要使用辅助索引,而记录按主键是顺序的,对其他索引,如辅助索引,就不会是顺序的,再插入时就会慢,尤其是大批数据插入时。
Insert Buffer 的设计思想是,当按辅助索引插入时先将记录放在Insert Bufer中,然后再以一定频率和情况进行insert buffer和辅助索引页子节点的merge(合并)操作,将多个插入合并到一个操作中(因为在一个索引页中),大大提高了对于非聚集索引插入的性能。

两次写(double write)

在对缓冲池中的脏页进行刷新时,并不是直接写磁盘,而是先将脏页写入到内存中的doublewrite buffer中,然后再同步磁盘。如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,Innodb存储引擎可以从共享表空间中的doublewrite中找到该页的一个副本。将其复制到表空间文件,再应用重做日志。

自适应哈希索引(adaptive hash index,AHI)

Innodb会监控对表上各索引页的查询,如果观察到建立哈希索引可以带来速度上的提升,则建立哈希索引,称之为自适应哈希索引。AHI是通过缓冲池中的B+树构造而来,因此建立的速度很快。Innodb会自动的根据访问的频率和模式来自动的为某些热点页建立索引。

异步IO(asynchronous IO,AIO)

与AIO对应的是同步IO,即每进行一次IO操作都需要等待此次操作结束才能继续接下来的操作。

AIO即是,用户可以在发出一个IO请求后,立即再发出一个IO请求,当全部IO请求发送完毕之后,等待所有的IO操作的完成,这就是AIO。

刷新邻接页(flush neighbor page)

其工作原理为:当刷新一个脏页时,Innodb会检测该页所在区(extent)的所有页,如果是脏页,那么一起刷新。这样做的好处是,通过AIO可以将多个IO操作合并为一个IO操作

innodb引擎的好处

a 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。

b 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。

c 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。

d 外键约束。MySQL支持外键的存储引擎只有InnoDB。

e 支持自动增加列AUTO_INCREMENT属性

f 热备份

你可能感兴趣的:(mysql,Innodb)