MySQL存储引擎 - Myisam & Innodb
2017-07-04 本文已影响56人
李颖轩_LiYingxuan
该文章纯属属于面试时使用,现在比较坑面试技术总监时也会从手写二叉树和引擎区别等理论开始问。
MySQL有多种存储引擎:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE
常用的就是:MyISAM与InnoDB这两个,但常用的就是两个。
InnoDB是MySQL 5.5版之后的默认数据库引擎(5.5版之后)。
两种存储引擎的主要区别
1、 存储结构
- MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
- InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
2、 存储空间
- MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
- InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
3、 可移植性、备份及恢复
- MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
- InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
4、 事务支持
- MyISAM:不支持;强调性能,每次查询具有原子性,其执行数度比InnoDB类型更快。
- InnoDB:支持(这条是innodb的最大特色);具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
5、 AUTO_INCREMENT
- MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引。
- InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引必须是第一列。
6、 表锁差异
- MyISAM:表级锁;select,update,delete,insert都会加锁,如果加锁以后的表满足insert并发,可在表尾部插入新数据。
- InnoDB:行级锁;大幅度提高了多用户并发操作的能力。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表。
7、 全文索引
- MyISAM:支持 FULLTEXT类型的全文索引
- InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
8、 表主键
- MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
- InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
9、 表的具体行数
- MyISAM:保存有表的总行数,count会直接取出该值。
- InnoDB:没有保存表的总行数,count会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
10、 CURD操作
- MyISAM:适合执行大量的SELECT。
- InnoDB:适合执行大量的INSERT或UPDATE;DELETE从性能上InnoDB更优,但删表时,InnoDB不会重新建立表,而是逐行删除。
11、 外键
- MyISAM:不支持
- InnoDB:支持
综上所述:大多数情况下,可以选择InnoDB,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。
另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。