大家好,我是小于哥啊,前几天能分享了第二期面试题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、书籍:
2:视频教程:
全网免费Java资源下载SpringBoot、Spring、Mybatis、Redis、RabbitMQ、SpringCloud、高并发(持续更新)_这个时代,作为程序员可能要学习小程序-CSDN博客
最后
最后,照旧安利一波我们的工种号:「终端研发部」,目前每天都会推荐一篇优质的技术相关的文章,主要分享java相关的技术与面试技巧,我们的目标是:知道是什么,为什么,打好基础,做好每一点!这个主创技术公众号超级值得大家关注。
如果你有什么技术上的问题,都可以咨询我,技术路上漫长而优雅, 于哥可以一直陪伴。如果有帮助,欢迎点赞!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。