大家好,我是小于哥啊,前几天能分享了第二期面试题MySQL 中搜索引擎的面试考点,这道题是面试常温的面试,看完在数据库引擎方面,我相信你一定会有收获的

还没有看我第一分享的可以去参考下:

第一期分享: 【问答分享第一弹】关于MySQL行锁、表锁、排他锁、共享锁,看完吊打面试官!

首发于公众号【终端研发部】

核心点

1、搜索引擎InnoDB和MyIsam的区别和联系
2、Memory的相关的 知识的补充

目标

1、搜索引擎InnoDB和MyIsam的区别和联系
2、Memory的相关的 知识的补充
3、关于主键和外键的区别和联系
4、应用场景

关于主键和外键的区别和联系:

主键就是一个表的主关键字,能够唯一确定这条记录的。

外键就是参考主表中的某一个字段的值,一般是一个主键记录对应多个外键记录。一般是某一张表的一个外键字段引用另一张表的主键。

![
](https://upload-images.jianshu...

首先说一下 为什么MyISAM会比Innodb 的查询速度快。

NNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多;

(1)数据块,INNODB要缓存,MYISAM只缓存索引块, 这中间还有换进换出的减少;

(2)innodb寻址要映射到块,再到行,MYISAM 记录的直接是文件的OFFSET,定位比INNODB要快

(3)INNODB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护MVCC ( Multi-Version Concurrency Control )多版本并发控制

InnoDB存储引擎

1、 InnoDB具有事务,回滚,崩溃修复能力和多版本并发的事务安全
2、关于InnoDB的auto_increment列:

InnoDB支持自动增长列,此列不能为空,且值必须唯一
此列必须为主键。插入时,不指定值,默认是自增都的值。指定0或者NULL时,也 是自增后的值。指定合法且不存在的值,则此后的自动从该值开始
3、InnoDB中的Foreign Key:
InnoDB支持外键。外键所在表通常称为子表。所依赖表称为父表。且父表中,被子表关联的字段必须为父表的主键。
(外键:可以简单的理解为:当对父表的数据进行更新,删除,添加时,子表的数据也会随之变化。例子很多,此处不举例)
4、InnoDB的存储引擎及其优缺点:
InnoDB存储引擎的存储格式有三个文件:
.frm表结构文件,此文件存放表创建时的字段定义等信息。
表的数据文件,存放在innodb_data_home_dir目录下,
表的索引文件,存放在innodb_data_file_path目录下
InnoDB存储引擎具有良好的ACID特性。
InnoDB的缺点:读写效率相对MYISAM比较差。占用的磁盘空间比较大。
5、InnoDB的理想使用场合:
高并发,更新操作比较多的表。需要使用事务的表。对自动灾难恢复有要求的表。

3:MYISAM存储引擎:

1、MYISAM存储引擎表的存储有三个文件:

.frm文件,存储表的结构
.myd文件,存储表的数据
.myi文件,存储表的索引

2、MYISAM存储引擎的存储格式

静态型
动态型

缩型:

3、MYISAM存储引擎的优缺点:

优点:占用空间小,处理速度快(相对InnoDB来说)
确定:不支持事务的完整性和并发性

### 总结

(1).事务处理:

MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等)

(2).锁机制不同:

MyISAM是表锁,InnoDB是行级锁。

(3).增删改查操作:

MyISAM:如果执行大量的查询操作,MyISAM是更好的选择

InnoDB:如果你的数据执行大量的插入/更新,出于性能方面的考虑,应该使用InnoDB表

(4).查询表的行数不用:

MyISAM: 执行select count() from table语句时 MyISAM只需要简单的查询出保存好的行数,当count()语句包含 where条件时,两种表的操作是一样的。

InnoDB: InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行

(5).外键

MyISAM不支持外键

mysiam表不支持外键,而InnoDB支持

补充 Memory存储引擎

Memory存储引擎的文件存储形式
Memory存储引擎也会再磁盘上形成一个 .frm的表结构文件,只是表的数据件并不以文件的形式存放在磁盘上。鉴于其数据存放在内存里,因此,访问速度更快。但需 要考虑的是:内存上数据的持久性。

Memory存储引擎的索引类型

默认 哈希索引

支持BTree索引

Memory特点

Memory存储引擎的数据存储周期 数据存放在内存上,一旦服务器关机,数据将不再存在

Memory存储引擎的优缺点:
Memory存储引擎不支持变长表列
MySQL4.1.0之前,不支持auto_increment列

使用场景

1、 MyISAM适合:

(1)做很多count 的计算;
(2)插入不频繁,查询非常频繁;
(3)没有事务。

2、InnoDB适合:

(1)可靠性要求比较高,或者要求事务;
(2)表更新和查询都相当的频繁,并且行锁定的机会比较大的情况。

3、Memory存储引擎的使用场合

速度要求快的,临时数据
丢失以后,对项目整体没有或者负面影响不大的时候。

ps: 如何学习java ,推荐两个白嫖学习的资料:

1、书籍:

codeGoogler/ProgramBooks

2:视频教程:

全网免费Java资源下载SpringBoot、Spring、Mybatis、Redis、RabbitMQ、SpringCloud、高并发(持续更新)_这个时代,作为程序员可能要学习小程序-CSDN博客

最后

最后,照旧安利一波我们的工种号:「终端研发部」,目前每天都会推荐一篇优质的技术相关的文章,主要分享java相关的技术与面试技巧,我们的目标是:知道是什么,为什么,打好基础,做好每一点!这个主创技术公众号超级值得大家关注。

如果你有什么技术上的问题,都可以咨询我,技术路上漫长而优雅, 于哥可以一直陪伴。如果有帮助,欢迎点赞!


爱编码的coder
1.2k 声望78 粉丝