MySQL存储引擎

71 阅读2分钟

说一下MySQL的InnoDB和MyISAM的区别?

事务:InnoDB支持事务和外键,MyISAM不支持事务,这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一

索引结构

InnoDB 是聚簇索引

  • 聚簇索引的文件存放在主键索引的叶子节点上,同时索引和记录存储在一起
  • 但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据
  • 因此,主键不应该过大,因为主键太大,其他索引也都会很大

MyISAM 是非聚簇索引

  • 数据文件是分离的,索引保存的是数据文件的指针
  • 也就是索引和记录是分开存储的

锁粒度:InnoDB最小锁粒度是行锁,MyISAM最小的锁粒度是表锁

  • 一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限(MyISAM)

conut的效率

  • InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描
  • MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快

拓展一下: 存储文件

InnoDB 表对应两个文件:

  • 一个是表结构文件(.frm)
  • 一个是数据文件(.ibd)

MyISAM 表对应三个文件:

  • 一个是表结构文件(.frm)
  • 一个是表数据文件(.myd)
  • 一个是索引文件(.myi)

讲一下MySQL的存储引擎?

  • InnoDB:
    • 是MySQL的默认存储引擎,具有ACID事务支持、行级锁、外键约束等特性
    • 适用于高并发读写操作,支持较好的数据完整性和并发控制
  • MyISAM:
    • 具有较低的存储空间和内存消耗,适用于大量读操作的场景
    • 不支持事务、行级锁和外键约束,因此在并发写入和数据完整性方面有一定的限制
  • Memory:
    • 将数据存储在内存中,适用于对性能要求较高的读操作,但是在服务器重启或崩溃时数据会丢失
    • 它不支持事务、行级锁和外键约束