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学习过程,如有错误请指正。

posted @ 2020-03-17 11:40  Ghostor  阅读(257)  评论(0编辑  收藏  举报