2.MySQL存储引擎

发布时间 2023-09-18 21:49:13作者: 壹索007

MySQL有Server层和存储引擎层,存储引擎层为插件式实现,redo log为InnoDB独有。

1.MySQL 支持哪些存储引擎?默认使用哪个?

  所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。

 

2.MySQL 存储引擎架构了解吗?

  MySQL 存储引擎采用的是插件式架构支持多种存储引擎,我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。存储引擎是基于表的,而不是数据库。

  可以根据 MySQL 定义的存储引擎实现标准接口来编写一个属于自己的存储引擎。这些非官方提供的存储引擎可以称为第三方存储引擎,区别于官方存储引擎。像目前最常用的 InnoDB 其实刚开始就是一个第三方存储引擎,后面由于过于优秀,其被 Oracle 直接收购了。

  MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。

 

3.MyISAM和InnoDB的区别:

  行级锁:MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

  事务:InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,具有提交(commit)和回滚(rollback)事务的能力。并且,InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。

  外键:MyISAM 不支持,而 InnoDB 支持。(外键是某个表中的一列,它包含在另一个表的主键中。 外键也是索引的一种,是通过一张表中的一列指向另一张表中的主键,来对两张表进行关联。 一张表可以有一个外键,也可以存在多个外键

外键对于维护数据一致性非常有帮助,但是对性能有一定的损耗。因此,通常情况下,我们是不建议在实际生产项目中使用外键的,在业务代码中进行约束即可!

  是否支持数据库异常崩溃后的安全恢复MyISAM 不支持,而 InnoDB 支持。

使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。

  是否支持 MVCCMyISAM 不支持,而 InnoDB 支持。

 MyISAM 连行级锁都不支持。MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能。

  索引实现不一样虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。

InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。

  性能差别:InnoDB 的性能比 MyISAM 更强大,不管是在读写混合模式下还是只读模式下,随着 CPU 核数的增加,InnoDB (因为支持并发)的读写能力呈线性增长。MyISAM 因为读写不能并发,它的处理能力跟核数没关系。

 

4.MyISAM和InnoDB如何选择:

  大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集(以读取为主)的情况下,使用 MyISAM 也是合适的。某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择 MyISAM 也是一个不错的选择。