mysql的存储引擎有哪些,区别是什么

发布时间: 2023-11-21 10:58 阅读: 文章来源:1MUMB643PS
mysql热门面试题

整理了一下mysql的面试,问得最多的有3个:

mysql引擎:innodb和isam的区别mysql索引:索引下推、索引覆盖、回表概念、like索引失效mysql锁和事务

我们先总结下mysql引擎相关问题,可以点赞收藏慢慢看。

灵魂3问:你知道哪些mysql存储引擎?有什么区别?适用于什么场景?

1、存储引擎

MyISAM和InnoDB

2、区别

(1)InnoDB支持事务,MyISAM不支持

(2)InnoDB支持外键,MyISAM不支持

(3)InnoDB是聚集索引,B+树作为索引索引结构,数据文件和主键索引是绑在一起的,辅助索引需要先查询到主键,再通过主键查询到数据;MyISAM是非聚集索引,也是B+树,但索引和数据文件是分离的,索引保存了数据文件指针,主键索引和辅助索引是独立的

(4)InnoDB不保存表的行数,没有where限定语句的count(*)需要全表扫描,因为InnoDB有事务,同一时刻表的行数对不同事务是不一样的;MyISAM用变量保存了表的行数。

(5)5.7以前的InnoDB不支持全文索引,MyISAM支持全文索引。

(6)MyISAM表可以被压缩后进行查询操作

(7)InnoDB支持表、行级锁,MyISAM只支持表级锁

(8)InnoDB表必须有唯一索引(比如主键索引),MyISAM可以没有

(9)InnoDB保存表定义文件、数据文件;MyISAM保存表定义文件,数据文件,索引文件。

3、使用场景

执行大量查询、没有并发问题,使用MyISAM;想利用事务特性,想要更小粒度的行锁减少并发消耗,使用InnoDBInnoDB为什么推荐使用自增ID作为主键?

自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

为什么InnoDB要用B+树,不用Hash,二叉树,AVL,红黑树、B树?

1、为什么不用Hash?

InnoDB有自适应哈希,单条数据查询的确哈希更快,但哈希不适合范围查找;

2、为什么不用二叉排序树?

容易退化为O(N)

3、为什么不用平衡平衡二叉树AVL、红黑树?

这些主要都是用于内存数据结构,比如Java的HashMap,Mysql这种磁盘数据结构,数据量大的时候,树的高度会很高,导致磁盘I/O次数变多,性能降低。

4、为什么不用B树?

B树和B+树的主要区别在于,B树的分支节点上存储着数据,B+树只在叶子节点存储数据。

(1)磁盘I/O的写次数比B树更低

B+树内部节点比B树更小,存的是索引,因此将key读入内存的值越多,查找磁盘的次数就越少。

(2)每次查询时间复杂度固定

B+树任意关键字的查找都必须从根节点走到叶子节点;而B树分支节点也有数据,数据的查询效率不同。

(3)遍历效率更高

对于范围查询,B+树有叶子节点的指针,因此只需要遍历叶子节点即可,但B树需要进行中序遍历来查找

(4)B树的高度更高,查询效率更低

B树由于分支节点会保存数据,这回导致分支节点能保存的指针数量变少,那么只能通过增加高度,高度增加会导致I/O操作变多,查询性能变低。

5、【深入】既然增加树的度可以降低树的高度,那么无限增加树的度是不是就有最优的查询效率?

并不会。因为这样会退化为一个有序数组,需要全部加载进内存,而B+树可以按节点根据查询进度分批加载。

6、B+树的查询复杂度是?

Olog(N)

总结语

如果你觉得有收获,可以点赞收藏转发一下,以后面试遇到这类问题也不怕啦。

•••展开全文