存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势, 本文只讨论最常见的InnoDB和MyISAM两种存储引擎。
1 InnoDB引擎
具备外键支持功能的事务存储引擎。支持事务、行锁
- 概述
- MySQL从3.23.34a开始就包含InnoDB存储引擎。
- 大于等于5.5之后,默认采用InnoDB引擎 ,也是MySQL默认的事务型引擎 。
- 优点
- 它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。
- 总结:除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
- 缺点
- InnoDB是为处理巨大数据量的最大性能设计 。对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引。
- MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较高 ,而且内存大小对性能有决定性的影响。
数据文件结构
概述:5.5之前默认的存储引擎,MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等
- 优势
- 访问的速度快 ,对事务完整性没有要求或者以SELECT、INSERT为主的应用。
- 针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高
- 应用场景:只读应用或者以读为主的业务
- 缺点
- 不支持事务、行级锁、外键
- 崩溃后无法安全恢复
- 数据文件结构
- 表名.frm 存储表结构
- 表名.MYD 存储数据 (MYData)
- 表名.MYI 存储索引 (MYIndex)
- 特别需要说明的是:MyISAM存储引擎也是使用B+Tree的,不过相对于InnoDB存储引擎,其叶节点的data域存放的是数据记录的地址。
3 InnoDB和Myisam对比
| | InnoDB | Myisam | | —- | —- | —- | | 概述 | InnoDB是默认的事务型存储引擎,也是最重要,使用最广泛的存储引擎。在没有特殊情况下,一般优先使用InnoDB存储引擎。 | MyISAM提供了大量的特性,包括全文索引,压缩,空间函数,延迟更新索引键等。
进行压缩后的表是不能进行修改的,但是压缩表可以极大减少磁盘占用空间,因此也可以减少磁盘IO,从而提供查询性能。
全文索引,是一种基于分词创建的索引,可以支持复杂的查询。
延迟更新索引键,不会将更新的索引数据立即写入到磁盘,而是会写到内存中的缓冲区中,只有在清除缓冲区时候才会将对应的索引写入磁盘,这种方式大大提升了写入性能。 | | 数据存储
形式 | 会将数据表分为.frm和.idb两个文件进行存储。
| 采用的是索引与数据分离的形式,将数据保存在三个文件中.frm .MYD .MYI
|
| 锁的粒度 | InnoDB采用MVCC(多版本并发控制)来支持高并发,InnoDB实现了四个隔离级别,默认级别是REPETABLE READ,并通过间隙锁策略防止幻读的出现。
锁粒度是行锁 | MyISAM不支持行锁,所以读取时对表加上共享锁,在写入是对表加上排他锁。由于是对整张表加锁,相比InnoDB,在并发写入时效率很低。 | | 数据的
存储特点 | InnoDB表是基于聚簇索引建立的,聚簇索引对主键的查询有很高的性能,不过他的二级索引(非主键索引)必须包含主键列,索引其他的索引会很大。 | MyISAM是基于非聚簇索引进行存储的。 | | 事务 | InnoDB是典型的事务型存储引擎,并且通过一些机制和工具,
支持真正的热备份。 | 不支持事务 | | 外键 | 支持 | 不支持外键 | | 关注点 | 性能:节省资源、消耗少、简单业务 | 事务:并发写、事务、更大资源 |
表的物理结构
InnoDB引擎(数据在聚集索引B+树的叶子节点上)
mysql默认存储过引擎即为InnoDB,该存储引擎就是使用B+Tree实现索引结构。
B+Tree 在 InnoDB 中的体现:在创建好表结构并且指定搜索引擎为 InnoDB之后,会在数据目录生成2个文件,分别是table_name.frm(表结构文件),table_name.idb(数据与索引保存文件)。
具体数据,mysql是怎么存储的呢?
在 InnoDB中,因为设计之初就是认为主键是非常重要的。是以主键为索引来组织数据的存储,当我们没有显示的建立主键索引的时候,搜索引擎会隐式的为我们建立一个主键索引以组织数据存储。数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同,InnoDB就是以聚集索引来组织数据的存储的,在叶子节点上,保存了数据的所有信息。
note:在InnoDB下,数据实际存在聚集索引叶子节点。
Myisam引擎(索引和数据分开)
在创建好表结构并且指定搜索引擎为 Myis.am之后,会在数据目录生成3个文件,分别是table_name.frm(表结构文件),table_name.MYD(数据保存文件),table_name.MYI(索引保存文件在Myisam中,数据区中保存的是数据的引用地址,就比如说ID为101的数据信息所保存到物理磁盘地址为 0x123456,在索引中的节点数据去中所保存的就是这个磁盘地址指针。当扫描到这个指针位置,就可以通过这个磁盘指针讲数据加载出来。
在Myisam中B+Tree的实现中比如现在不用ID作为索引了,要用name,那么他的一个展现形式有事怎么样的呢?其实他与ID作为索引是一样的,也是保存他指定的磁盘位置指针,他们是平级的。
如何选择?
两种存储引擎各有各的有点,MyISAM专注性能,InnoDB专注事务。两者最大的区别就是InnoDB支持事务,和行锁。
如何在两种存储引擎中进行选择?
①是否有事务操作?有,InnoDB。
②是否存储并发修改?有,InnoDB。
③是否追求快速查询,且数据修改较少?是,MyISAM。
④是否使用全文索引?如果不引用第三方框架,可以选择MyISAM,但是可以选用第三方框架和InnDB效率会更高。
