数据库复习笔记6——MySQL引擎InnoDB和MyISAM对比

MySQL引擎InnoDB和MyISAM对比

索引区别 

在MySQL最常用的两类引擎InnoDB、MyISAM中都使用了B+树作为默认的索引数据结构。但我们之前说过,他们在底层的实现方法略有不同,这里再总结一下: 

1、InnoDB对于聚集索引,B+树的叶子节点会存放对应Key的完整记录(索引和数据指针),访问时可以直接获取所有的列,十分方便。但对于非聚集索引,B+树的叶子结点只存放对应Key的记录的主键,如果需要访问完整的记录,必须进行回表,依据主键二次访问聚集索引树。

  • 之所以只在非聚集索引中存放主键,是因为防止数据冗余,减少空间浪费。在牺牲较少查询的性能下节省了巨大的磁盘空间。

InnoDB索引

                                                                                          InnoDB索引

2、MyISAM对于非聚集索引和聚集索引,无一例外都只在叶子节点中存放指向对应记录物理位置的指针,所以如果根据非聚集索引访问记录,MyISAM将会比InnoDB耗时更短,因为它只需要一次访问,直接找到物理地址后就可以直接定位到数据记录。但是很明显,MyISAM的插入删除数据性能更差。我们如果要在InnoDB中添加数据,只需要修改B+树的叶子结点(链接存储),但如果要在MyISAM中添加数据,需要移动磁盘上很多条记录(顺序存储)。
MyISAM索引

存储引擎的选择

  • 若数据库平台读多写少,可以选择MyISAM引擎,如博客系统、学习网站等;
  • 若数据库平台更新操作(增删改)较多,则选择InnoDB,如信息管理系统等。

完整区别

  • InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
  • InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败
  • InnoDB使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。**主键索引和辅助索引是独立的。
  • InnoDB不保存表的具体行数,执行select count∗∗ from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)
  • MyISAM表格可以被压缩后进行查询操作
  • InnoDB支持表、行默认级锁,而MyISAM支持表级锁
  • InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有

如何选择:

  • 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM
  • 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB
  • 系统崩溃后,MyISAM恢复起来更困难,能否接受;
  • MySQL5.5版本开始Innodb已经成为Mysql的默认引擎,建议使用InnoD

InnoDB的四大特性

  • 插入缓冲(insert buffer)
  • 二次写(double write)
  • 自适应哈希索引(ahi)
  • 预读(read ahead)

自增ID( AUTO_INCREMENT)

InnoDB推荐使用自增ID作为主键,自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入效率比较差

参考资料:

1、https://hillzhang1999.gitee.io/2020/05/29/shu-ju-ku-fu-xi-ji-yu-mysql/#toc-heading-92

猜你喜欢

转载自blog.csdn.net/ProQianXiao/article/details/108328219