存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有不少,不一样的存储引擎保存数据和索引的方式是不一样的。每一种存储引擎都有它的优点和劣势,本文只讨论最多见的InnoDB和MyISAM两种存储引擎进行讨论。本文中关于数据存储形式和索引的能够查看图解MySQL索引html
MySQL逻辑架构图:cookie
InnoDB是默认的事务型存储引擎,也是最重要,使用最普遍的存储引擎。在没有特殊状况下,通常优先使用InnoDB存储引擎。架构
1️⃣、数据存储形式并发
使用InnoDB时,会将数据表分为.frm 和 idb两个文件进行存储。mvc
2️⃣、锁的粒度框架
InnoDB采用MVCC(多版本并发控制)来支持高并发,InnoDB实现了四个隔离级别,默认级别是REPETABLE READ,并经过间隙锁策略防止幻读的出现。它的锁粒度是行锁。【经过MVCC实现,MVCC在稍后会进行介绍】函数
3️⃣、事务高并发
InnoDB是典型的事务型存储引擎,而且经过一些机制和工具,支持真正的热备份。工具
4️⃣、数据的存储特色性能
InnoDB表是基于聚簇索引(另外一篇博客有介绍)创建的,聚簇索引对主键的查询有很高的性能,不过他的二级索引(非主键索引)必须包含主键列,索引其余的索引会很大。
1️⃣、数据存储形式
MyISAM采用的是索引与数据分离的形式,将数据保存在三个文件中.frm.MYD,.MYIs。
2️⃣、锁的粒度
MyISAM不支持行锁,因此读取时对表加上共享锁,在写入是对表加上排他锁。因为是对整张表加锁,相比InnoDB,在并发写入时效率很低。
3️⃣、事务
MyISAM不支持事务。
4️⃣、数据的存储特色
MyISAM是基于非聚簇索引进行存储的。
5️⃣、其余
MyISAM提供了大量的特性,包括全文索引,压缩,空间函数,延迟更新索引键等。
进行压缩后的表是不能进行修改的,可是压缩表能够极大减小磁盘占用空间,所以也能够减小磁盘IO,从而提供查询性能。
全文索引,是一种基于分词建立的索引,能够支持复杂的查询。
延迟更新索引键,不会将更新的索引数据当即写入到磁盘,而是会写到内存中的缓冲区中,只有在清除缓冲区时候才会将对应的索引写入磁盘,这种方式大大提高了写入性能。
两种存储引擎各有各的有点,MyISAM专一性能,InnoDB专一事务。二者最大的区别就是InnoDB支持事务,和行锁。
如何在两种存储引擎中进行选择?
① 是否有事务操做?有,InnoDB。
②是否存储并发修改?有,InnoDB。
③是否追求快速查询,且数据修改较少?是,MyISAM。
④是否使用全文索引?若是不引用第三方框架,能够选择MyISAM,可是能够选用第三方框架和InnDB效率会更高。
MySQL大多数事务型存储引擎实现的都不是简单的行锁。基于提高并发性能的考虑,他们通常都同时实现了多版本并发控制(MVCC)。
能够认为MVCC是行级锁的一个变种,它能在大多数状况下避免加锁操做,所以开销更低。不管怎样实现,它们大豆实现了非阻塞的读操做,写操做也只锁定制定的行。
MVCC是经过保存数据在某一个时间点的快照来实现的,也就是说不管事务执行多久,每一个事务看到的数据都是一致的。InnoDB的MVCC,是经过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的建立时间,一个保存了行的过时时间(或删除时间),固然,并不是存储的是时间,而是系统版本号。每开启一个事务,版本号都会递增,事务开始时刻的系统版本号会做为事务的版本号。
id | name | 建立时间(行版本号) | 删除时间(删除版本号) |
---|---|---|---|
1 | Mary | 1 | null |
2 | Jann | 1 | null |
以InnoDB存储引擎的的REPEATABLE READ隔离级别来讲:
SELECT
①只查询建立时间版本号小于当前事务版本号的数据行(保证事务读取的行要么在事务开始以前就存在,要么是事务自己插入的行)
②行的删除版本号要么未定义,要么大于当前事务版本号,这样能够确保事务读取到的行,在开始事务以前未被删除
只有复合上诉两个条件的记录才会做为结果返回
INSERT
为插入的数据保存当前系统版本号做为行版本号
DELETE
保存当前系统版本号做为删除行版本号
UPDATE
插入一行数据,并将当前系统版本号赋予行版本号;同事保存当前系统版本号到原来的行做为删除版本号。
注:MVCC只在REPEATABLE和READ COMMITTED两个隔离级别下才能正常工做。
个人我的博客:李强的我的博客(基于SSM,Nginx+Redis的后台架构)