使用MySQL 数据库的小伙伴们想必在面试的时候经常会被问到Innodb和MyISAM 这两种存储引擎的区别,因为这两种存储引擎是我们经常使用的,接下来我将针对一些比较常用的问题做下总结:
- 如果你的业务数据一直性要求比较高,建表的时候你会选择使用哪种存储引擎?
答:InnoDB
这个问题相信绝大多数人都会回答正确,因为我们知道InnoDB支持事务而MyISAM不支持事务
- InnoDB为什么支持事务?
答:是通过日志(log) 和锁来实现的。
这个问题估计一半的人都不太了解吧,我们知道事务有4个属性:原子性,一致性,隔离性,持久性 ,也就是我们经常说的ACID,其中 ACD 是通过日志(log)来实现,隔离性是通过锁来实现的,具体的实现方式请关注后续文章。
3.如果业务数据量比较大,你会选择使用哪种存储引擎,为什么?
答:InnoDb,我们知道InnoDB 默认支持行锁,而MyISAM不支持行锁的,InnoDB 锁粒度更小,能支持更大的并发量,当然,锁的粒度越小意味着开销也是越大的,而MyISAM 只支持表锁,也就是如果有个写(insert,update) 操作的时候就会锁住整个表,这会导致其他的都和写操作阻塞,如果并发量大的话就会造成严重的阻塞,因此,实践总结:当我们业务数据量大的时候我们选择InnoDB引擎,当我们的表主要以查询为主时我们选用MyISAM。
4.如果一张表没有设置主键会怎样?
答:一般我们会为每张表设置一个自增主键,如果表使用的时MyISAM存储引擎,没有设置主键影响不大,如果表的InnoDB存储引擎则会影响性能,因为InnoDB 在没有主键或者一个唯一的索引的时候会以一个包含行ID值的合成列生成一个隐藏的聚簇索引,长度为6字节,这个生成的列是共享的,也就是所有没有主键的表都共享这个聚簇索引,可想而知是会影响性能的。
网友评论