MyISAM与InnoDB区别
一、前言
1.Mysql5.5版本开始Innodb是默认引擎(之前是MyISAM),本文仅针对5.5之后版本做比较,先会给出结论最后给出选择。
2.聚集索引:索引值顺序和数据存储顺序一致。
3.非聚集索引:索引值顺序和数据存储顺序不一致。
二、区别
1.InnoDB支持事务,MyISAM不支持。
2.InnoDB支持外键,MyISAM不支持。
3.InnoDB与MyISAM都是B+树的索引结构,区别在Innodb是聚集索引,MyISAM是非聚集索引
1)InnoDB:聚集索引,数据与(主键)索引绑定在一起(表数据文件本身就是按B+Tree组织的一个索引结构),必须存在主键,辅助索引叶子节点存的是主键值,因此辅助索引无法直接定位行记录,需要先查询到主键值,在通过主键查询到数据,这个需要两遍扫描索引树,这个过程是回表,后续单拉一篇和覆盖索引一起写一写学习记录一下。
2)MyISAM:非聚集索引,,索引和数据分离(叶子节点存的是指向数据的指针而非数据本身),主键索引与辅助索引独立的。
4.InnoDB不保存具体行数,执行select count(*) from T 时需要全表扫描,而MyISAM保存了表行数,执行相同语句只需要读取变量(不能加where)。
5.InnoDB不支持全文索引(5.7之前不支持,之后开始支持),而MyISAM支持全文索引,查询速度更快。
全文索引我用的很少,想要了解的可以看看这个https://blog.csdn.net/u011734144/article/details/52817766/
6.MyISAM表格可以被压缩后进行查询操作。
7.InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁,InnoDB的行锁实现在索引上,如果没有命中索引则不会使用行锁,退化为表锁。
8.InnoDB必须要有主键(用户未指定会自己生成一个),MyISAM可以没有。
9.InnoDB存储文件有frm、ibd,MyISAM有frm、myd、myi
1)InnoDB:frm是表定义文件,ibd是数据文件。
2)MyISAM:frm表定义文件,myd数据文件,myi索引文件。
三、选择
1.需要支持事务,选择InnoDB,不需要则选择MyISAM。
2.表中多数只是读查询,选择MyISAM,有写有读选InnoDB。
3.MyISAM系统崩溃恢复难,考虑成本。
四、结语
1.InnoDB推荐用自增ID作为主键,自增ID可以保证每次插入B+ 树是从右侧扩展,可以避免树频繁的合并与分裂。以uuid举例,其插入数据具有随机性,当主键不确定,插入的数据B+树叶子节点的中间,会导致叶子节点频繁分裂,数据的存储和B+树的分裂不一致,page页新增时,出现磁盘存储的碎片化等一系列的问题,同时在需要进行 insert 操作,将会读取整个 B+ 树节点到内存,在插入这条记录后会将整个节点写回磁盘,这种操作在记录占用空间比较大的情况下,性能下降明显。
2.本文主要记录Mysql学习过程,如有错误请指正。