Mysql 存储引擎

InnoDB

InnoDB是MySql默认的事务型存储引擎,只有在需要innoDB不支持的特性时,才考虑使用其它存储引擎。

采用MVCC来支持高并发,并且实现了4个标准的隔离机制,默认级别可重复读,并且通过间隙锁策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

表是基于聚簇索引建立的,它对主键的查询性能有很高的提升。

内部做了很多优化,包括从磁盘读取数据时的可预测性读、能够自动在内存中创建哈希索引以加速读操作的自适应哈希索引、能够加速插入操作的插入缓冲区等。

通过一些机制和工具支持真正的热备份。其它存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。

InnoDB架构

InnoDB是一个非常庞大的系统,大到包含许多子系统且代码分布在几十个目录中。采用了层次结构的设计。

在第一层,Handle API的存在,使得InnoDB能够顺利插入到MySql服务器中。同时InnoDB还为应用系统提供了API,在这种情况下,用户可以直接将InnoDB存储引擎嵌入到他的应用系统之中。

第二层是事务层。在InnoDB中,所有的行为都发生在事务中。如果我们在my。cnf中配置了auto-commit这一属性,那我们执行的每个SQL语句都是一个单独的事务。SQL关键字COMMIT、ROLLBACK等被查询解析子系统解析为InnoDB特有查询语句。

第三层是锁功能层。该层完成锁功能和事务管理和功能(如回滚、提交等操作)。InnoDB采用行级的读写锁。Lock目录下的lock0lock.c处理所有的锁功能。InnoDB还特意使用一个锁表来跟踪各种各样锁的情况。

第四层是缓存管理。缓存管理层的主要目标是高效地将数据存放在内存之中。该层的功能由目录buf中的源文件实现。Buf0buf.c提供了缓存池以备将文件分页存入内存。

第五层是缓存管理。缓存管理层的主要目标是为文件读写提供接口并维护表空间和日志空间的大小。该层的代码主要分布在fil目录下。InnoDB为了提供高效的磁盘访问,采用和REAID0相似的条带化方法将逻辑快数据分布到不同的几个物理文件中。

MyISAM

MyISAM提供了大量的特性,包括全文索引、压缩表、空间数据索引等。应该注意的是,MySQL也添加了对InnoDB存储引擎的全文索引支持。

不支持事务。

不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取查询的同事,也可以往表中插入新的记录,这被称为并发插入。

可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。

如果指定了DELAY_KEY_WRITE选项,在每次修行执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。

MyISAM设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以继续使用MyISAM。

MyISAM架构:

MyISAM创建表时,目录一般会生成3个文件:.MYD、.MYI和.frm文件;.MYD存放数据,.MYI存放索引,表结构存放在.frm中。

1、数据文件(.MYD)

数据文件格式相对简单,即数据和元数据相互穿插存储。MyISAM支持三种不同存储格式——固定的、动态的和压缩的。

2、索引文件(.MYI)

MyISAM存储引擎的每个表都对应一个MYI文件。MYI文件包含两部分——头部信息和索引值。

3、元数据文件(.frm)

MySql中的表,在磁盘上均有一个.frm作为扩展名的文件于之对应。frm在所有平台上的格式是一样的。

比较:

1、事务:InnoDB是事务性的。

2、备份:InnoDB支持在线热备份。

3、崩溃恢复:MyISAM崩溃后发生损坏的概率比InnoDB高很多,而且恢复的速度也更慢。

4、并发:MyISAM只支持表级锁,而InnoDB还支持行级锁。

5、其它特性:MyISAM支持压缩表和空间数据索引。

原文地址:https://www.cnblogs.com/ybf-yyj/p/9164775.html