存储引擎:InnoDB和MyISAM

前言

高性能MySQL有些疑问,查阅记录下来。

InnoDB存储引擎

历史

早在MySQL5.1时,InnoDB是作为一个插件来扩展MySQL的功能的,MySQL内部依旧是用的老版本的InnoDB,原因是因为其版权是归有Oracle所有(当时sun还没有被收购),后来sun被收购以后版本的MySQL也就是5.5以后,都是使用的InnoDB来作为默认的存储引擎,现在大多企业用的都是MySQL5.7版本,扩展了更多的新特性。

概览

InnoDB数据存储在表空间,有一系列数据文件组成。

InnoDB以MVCC来支持高并发,实现了是个数据隔离级别,默认隔离级别是可重复读,需要注意的是它通过间隙锁来防止出现的幻读现象,间隙锁不仅仅锁定查询时的行,还对索引中的间隙进行锁定。

InnoDB做了很多优化,其中的表是基于聚簇索引建立的,对主键查询具有很高的性能,它可以自动的创建自适应哈希索引,关于它的索引以后再介绍。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
MVCC(多版本并发控制):
InnoDB事务的实现不仅仅是行级锁,也通过MVCC实现了非阻塞的读操作,
正常情况下当已存在数据的写入时,读操作涉及到相关行时会被阻塞的,
但是通过MVCC让读操作依旧可以读取到正确的数据。
可重复读的实现:
通过在每行记录后添加两个隐藏的列,分别是行的行版本号,
和行的删除版本号,只要增删改查满足一定的规则,
那么大部分的查询操作都没有必要加锁。
规则:
select:
1. 只查询行的行版本号小于或者等于当前事务版本号
2. 行的删除版本号要么未定义,要么大于当前事务版本号
insert:
1. 插入的每一行都保存当前事务版本号为行版本号
delete:
1. 删除的每一行都保存当前事务版本号为行的删除版本号
update:
1. 保存当前事务版本号为行的型版本号和删除版本号
1
2
3
4
5
6
间隙锁:
当使用范围条件检索数据,或者相等条件的一个不存在记录,
InnoDB会将范围内所有数据加锁。这样做一方面是为了防止幻读
(比如查询年龄大于20,那么之后有数据插入年龄大于20会直接失败),
另一方面为了恢复和复制数据(因为MySQL时按照BINLOG中的SQL和
事务的提交顺序来恢复的,Oracle是以数据块和系统更新号SCN来恢复的;)。

MyISAM存储引擎

存储

MyISAM是MySQL5.1和之前的默认存储引擎,将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名,它可以压缩表,但是被压缩的表是无法被修改的,但是可以解压缩。

特性
  • 加锁是对整张表加锁,不支持行级锁
  • 不支持事务,崩溃后修复可能会丢失数据,因为没有MVCC
  • 支持全文索引,可以延迟更新索引键

相关

  1. MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
  2. 高性能MySQL