前两天我朋友他跳槽了,之前在网上疯狂的找面试题以及资料。在他拿到大厂offer的时候整理出来了这十篇Mymsql面试题资料,威逼利诱下才加他发给我,今天就给大家分享出来。
1. MySQL 支持哪些存储引擎?
【参考答案】
MySQL 支持的存储引擎主要有四种:
(1)InnoDB 支持事务,行级锁定和外键,是事务型数据库的首选引擎;MySQL5.5.5 之后的默认存储引擎;
(2)MyISAM 拥有较高的插入、查询速度,但不支持事务。MySQL5.5.5 之前的默认存储引擎;
(3)Memory 基于散列,存储在内存中,对临时表有用。常见的应用场景是:临时存放数据,数据量不大,并且不需要较高的数据安全性;
(4)Archive 支持高并发的插入操作,但是本身不是事务安全的。常见的应用场景:存储归档数据,如记录日志信息可以使用 Archive。
2. MySQL 索引底层是什么结构?选择采用此结构有什么好处?
【参考答案】
MySQL 索引底层采用 B + 树的存储结构。采用 B + 树的原因:
(1)索引文件很大,不能全部存储在内存中,只能存储到磁盘上,因此索引的数据结构要尽量减少查找过程中磁盘 I/O 的存取次数;
3. 为什么不选B树呢?
【参考答案】
B + 树所有的 Data 域在叶子节点,其余节点用来索引,而 B 树是每个索引节点都会有 Data 域;并且 B + 树所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,从而支持区分查询。在数据库中基于范围的查询是非常频繁的,而 B 树不支持这样的遍历操作。
4. 为什么不选择红黑树?
【参考答案】
红黑树往往高度过大,从而造成磁盘 IO 读写过于频繁,效率低下。而且逻辑上很近的节点(父子)物理上可能很远,无法利用局部性原理。
5. InnoDB 和 MyISAM 有什么区别呢?
【参考答案】
- InnoDB 支持事务;而 MyISAM 不支持事物,强调的是性能,查询速度更快;
- InnoDB 支持行级锁和表级锁(默认行级锁),而 MyISAM 只支持表级锁;
- InnoDB 支持 MVCC, 而 MyISAM 不支持 MVCC;
- InnoDB 支持外键,而 MyISAM 不支持外键;
- InnoDB早期版本不支持全文索引(从 MySQL5.6 开始支持全文索引),而 MyISAM 支持;
- InnoDB 不保存表的具体行数,count () 时要扫描一遍整个表来计算有多少行;MyISAM 则内置了一个计数器,count () 时它直接从计数器中读。
注意:在 MySQL 中,索引就是在存储引擎层实现的,不同存储引擎的索引的工作方式并不一样,即使不同的存储引擎支持同一种类型的索引,其底层的实现也可能不同。而这些存储引擎中以 InnoDB 应用最广泛,很多面试题也围绕着它展开。
6. MySQL 支持的索引类型是哪些?
【参考答案】
- 普通索引:用表中的普通列构建的索引,没有任何限制;
- 唯一索引:唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;
- 主键索引:是一种特殊的唯一索引,根据主键建立索引,不允许重复,不允许空值;
- 全文索引:通过建立倒排索引,快速匹配文档的方式。MySQL 5.7.6 之前仅支持英文,MySQL 5.7.6 之后支持中文;
- 组合索引:又叫联合索引。用多个列组合构建的索引,这多个列中的值不允许有空值。可以在创建表的时候指定,也可以修改表结构。
7. 知道聚集索引和非聚集索引吗?
【参考答案】
- 聚集索引 (clustered index) ,又称为主索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。因为数据真正的数据只能有一种排序方式,所以一个表上只能有一个聚簇索引。
- 非聚集索引 (secondary index) ,又称为辅助索引、普通索引,该索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表可以包含多个非聚集索引。
注意: 聚集索引 / 非聚集索引不是一种索引类型,而是一种存储数据的方式。在 InnoDB 中它们还有一个非常重要的区别:聚集索引的叶子节点的的 data 域包含了完整的数据记录,而非聚集索引的叶子节点的 data 域记录着主键的值,因此在使用非聚集索引进行查找时,需要先查找到主键值,然后再到聚集索引中进行查找,这称之为回表查询。
8. 索引有什么缺点?
【参考答案】
- 索引需要额外的占用物理空间,索引越多,所以空间越多;
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的写速度;
9. 索引什么时候会失效?
【参考答案】
索引失效通常有以下原因:
- 条件中有 or;
- like 查询(以 % 开头);
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引;
- 对列进行函数运算(如 where md5 (password) = “xxxx”);
- 负向查询条件会导致无法使用索引,比如 NOT IN,NOT LIKE,!= 等;
- 对于联合索引,不是使用的第一部分 (第一个),则不会使用索引(最左匹配);
- 如果 mysql 评估使用全表扫描要比使用索引快,则不使用索引;。
10. 为什么不选择哈希表?
【参考答案】
- 哈希表只适用与查找等值查询, 不能支持区分条件(大于小于查询)、模糊查询等;
- hash 索引虽然在等值查询上较快,但是不稳定,性能不可预测,当某个键值存在大量重复的时候,发生 hash 碰撞,此时效率可能极差。而 B + 树的查询效率比较稳定。
——————————————————————
资料领取方式:点赞+收藏后,私聊小编:资料,免费领取
看完记得点赞+收藏哦!在这里也祝愿读者们都可以拿到自己心仪的offer哦!