更多详情内容请访问:MySQL 系列文章导读

1、InnoDB

1.1 具体介绍

具备外键支持功能的事务存储引擎

  1. MySQL5.5 之后的默认存储引擎
  2. InnoDB 是 MySQL的默认事务引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)
  3. 除了增加和查询外,还需要更新、删除操作,那么,应优先选择 InnoDB 存储引擎
  4. 对比 MyISAM 存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保存数据和索引
  5. 不仅缓存索引还要缓存真实数据,对内存有要求高,内存大小对性能有决定性影响

1.2 文件结构

  1. 表名.frm:存储表结构(MySQL8 以后合并在 表名.ibd 中)
  2. 表名.ibd:存储数据和索引

2、MyISAM

2.1 具体介绍

  1. MySQL5.5 之前的默认存储引擎
  2. 提供了大量的特性,包括全文索引、压缩、空间函数等,但 MyISAM 不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复
  3. 访问速度快,对事务完整性没有要求或者以 SELECT、INSERT 为主的应用(以只读应用为主的业务)
  4. 针对数据统计有额外的常数存储,故而 count(*) 的查询效率高
  5. 只缓存索引,不缓存真实数据

2.2 文件结构

  1. 表名.frm:存储表结构
  2. 表名.MYD:存储数据
  3. 表名.MYI:存储索引

3、InnoDB 与 MyISAM

InnoDB MyISAM
外键支持功能的事务存储引擎 非事务处理存储引擎
InnoDB 是聚集索引,且必须具有唯一索引 MyISAM 是非聚集索引(二级索引、辅助索引),可以没有唯一索引
支持表、行(默认)级锁 支持表级锁
不仅缓存索引还要缓存真实数据 只缓存索引,不缓存真实数据
不保存表的具体行数,执行 count(*) 时需要全表扫描 用一个变量保存了整个表的行数,执行 count(*) 时只需要读出该变量即可,速度很快
InnoDB 的 B+ 树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值 MyISAM 的 B+ 树主键索引和辅助索引的叶子节点都是数据文件的地址指针
空间、内存使用率高,插入速度低 空间、内存使用率低,插入速度快
数据和索引一起保存 .ibd(MySQL 8版本中) 表结构 .frm;索引 .myi;数据 .myd
适合插入更新频繁的 适合读多更新少的

4、自增主键

4.1 对于自增主键的理解

InnoDB引擎的自增值,其实是保存在了内存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 MySQL 重启前的值”,具体情况是:(查看表结构,会看到自增主键=多少)

  • 在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值

    举例:

    如果一个表当前数据行里最大的 id 是10,AUTO_INCREMENT=11。这时候,我们删除 id=10 的行,AUTO_INCREMENT 还是11。但如果马上重启实例,重启后这个表的 AUTO_INCREMENT 就会变成10。也就是说,MySQL 重启可能会修改一个表的 AUTO_INCREMENT 的值

  • 在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值

4.2 InnoDB 为什么推荐用自增 ID

  1. 主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费
  2. 新插入的行一定会在原有的最大数据行下一行,MySQL 定位和寻址很快,不会为计算新行的位置而做出额外的消耗
  3. 减少了页分裂和碎片的产生

END

本文作者:
文章标题:InnoDB 与 MyISAM 存储引擎
本文地址:https://www.pendulumye.com/mysql/339.html
版权说明:若无注明,本文皆个人学习记录原创,转载请保留文章出处。
最后修改:2022 年 07 月 13 日
千山万水总是情,给个一毛行不行💋