这是一道经典的程序员面试题,Mysql数据库在超大并发下,特别是Insert语句比较多的情况下,应该选择哪种存储引擎,很多人会说MyISAM,今天我们来简单介绍下Mysql的MyISAM存储引擎。

锁粒度

首先我们来了解 一些MyISAM与InnoDB的一些区别,首先是锁粒度,MyISAM只有表锁而InnoDB拥有行锁。也就是说,Mysql的InnoDB的锁粒度更小,锁粒度小,有时候是好事有时候也是坏事,假如我们只是修改几行的数据,那么锁粒度小显然会更优,如果涉及的行数比较多的时候,行锁会造成更大的内存消耗,速度也会更慢一些。那么有一个问题,如果是表粒度锁,如何保证请求不会被饿死。饿死是一个计算机的名词,指的是某个请求一直得不到执行,例如有一个写操作,同时又有很多个查询操作,由于查询操作比较慢,锁一直得不到释放,所以被饿死了。在Mysql的MyISAM引擎中,会优先处理写请求,防止请求被饿死。

mysql 面试 实验 mysql面试题经典_mysql 面试 实验

索引

Mysql的MyISAM是非聚集索引,原始文件跟索引文件是分开存储,每次查询都要先查询索引文件,再查询原始数据。而InnoDB是聚集索引,数据文件跟索引存在一起,如果通过主键查询,可以直接索引到数据文件。

事务

Mysql的MyISAM是不支持事务,对于每一条语句都会单条提交,而InnoDB的一个强大之处在于可以支持事务。

其他

Mysql的MyISAM还比较难以恢复,当发生故障的时候,数据恢复起来比较麻烦。但是,MyISAM引擎也并非一无是处,如果我们的业务场景都是增加跟查询的时候,MyISAM会变得非常快,这个时候,MyISAM每次插入都是追加写文件,但是如果出现删除的时候,文件就会出现空洞,这个时候会优先写空洞,造成速度又慢下来。

总结

Mysql在5.5版本之后,就用InnoDB替换MyISAM成为Mysql的默认存储引擎,这并不是没有道理的。虽然MyISAM在个别场景下,速度会优于InnoDB,但是InnoDB更加灵活,并且一旦崩溃的时候,InnoDB恢复会更加方便,所以更加推荐使用InnoDB。回到我们最初的面试题,虽然在这些情况下,MyISAM会稍微有点优势,但是,架构师与程序员考虑问题不能只考虑性能,考虑到可用性与扩展性,InnoDB似乎是一种更优的选择。欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。