前言
分类汇总 50+ 常见的 MySQL篇 经典后端面试题,并对题目进行了精炼总结,旨在帮助大家高效记忆,在面试中游刃有余,不至于陷入词穷的窘境。
MySQL 篇
什么是索引?
索引是数据库中用于加速数据检索的数据结构,存储在磁盘,索引过多会影响插入更新功能。
创建索引的三种方式?
-
CREATE INDEX:使用CREATE INDEX语句创建索引。
-
ALTER TABLE:使用ALTER TABLE语句添加索引。
-
建表时指定:在创建表时,在列定义中指定索引。
索引有哪些优缺点?
-
优点:
索引可以加快数据查询速度,减少查询时间。唯一索引可以保证数据库表中每一行的数据的唯一性。 -
缺点:
创建索引和维护索引要耗费时间,需要占物理空间,表中的数据进行增、删、改的时候,索引也要动态的维护。
MySQL 索引有哪些类型?
-
B-Tree索引(支持等值和范围查询)。
-
哈希索引(支持等值,不支持范围查询,查询快)。
-
全文索引(全文搜索,查找文本中的关键字)。
-
R-Tree索引(支持多维数据的范围查询)。
B+ 树了解吗?底层呢?
-
B+树是一种自平衡的树型数据结构,通常用于数据库和文件系统中,用来存储有序的数据和提供快速的检索。
-
B+树所有关键字都在叶子结点上,非叶子结点仅用来索引。叶子结点之间通过指针相互连接,形成有序的链表结构,便于范围查询和排序。每个结点存储的关键字数量相对较多,可以充分利用磁盘块的大小,减少IO次数。
B+ 树是怎么进行存储的?存储的文件有什么区别?
-
底层存储:
- B+树的底层存储一般是基于磁盘的存储系统,通常采用页式存储结构。B+树中的节点大小通常与磁盘页的大小相近,这样可以最大程度地利用磁盘空间,减少磁盘I/O次数。
-
存储的文件区别:
- 索引文件用于快速定位数据记录的位置,数据文件存储实际的数据记录。
- 索引文件和数据文件分开存储,索引文件和数据文件的结构通常是预定义的。
Hash 索引和 B+ 树索引的区别?
-
Hash索引:基于哈希表,键值映射到哈希桶,等值查询快,占用空间较少。但不支持高效范围查询,且数据无序。
-
B+树索引:多路搜索树,节点存储键值和指针,等值和范围查询快,支持高效范围查询,叶子节点有序,但可能占用更多空间。
请概述一次 B+ 树索引树查找过程
-
从根节点开始,比较查找键与节点内键值。
-
根据比较结果,选择合适的子节点继续查找。
-
重复步骤2,直到到达叶子节点。
-
在叶子节点中查找目标键值,找到则返回对应数据记录。
为什么 MySQL 选择使用 B+ 树作为索引结构?为什么不用二叉树?
B+树的节点可以存储更多键值和指针,减少磁盘I/O次数。叶子节点形成有序链表,支持高效范围查询。B+自平衡,确保查询效率稳定。多路结构在磁盘上更紧凑,减少存储空间。而二叉树在磁盘存储上效率较低,不适合大规模数据存储和查询。
什么是聚簇索引?
聚簇索引是一种数据存储方式。一个表只能有一个聚簇索引,通常是主键索引。索引和数据行是存储在一起的,数据行按索引键的顺序存储。聚簇索引使得数据行在物理上按顺序存储,提高范围查询和顺序访问的效率。
什么是非聚簇索引?
非聚簇索引(也称为二级索引)是一种索引结构,索引和数据行分开存储。非聚簇索引的叶子节点存储索引键和指向数据行的指针,而不是数据行本身。非聚簇索引可以有多个,适用于频繁更新的场景,但查询时可能需要额外的I/O操作来获取数据行。
什么是回表?
回表是指在使用非聚簇索引进行查询时,通过索引找到数据行的指针后,再根据指针到数据表中查找实际数据行的过程。回表操作会增加额外的I/O开销,影响查询性能。
怎么减少回表次数?
-
覆盖索引:如果查询所需的所有列都在索引中,则不需要回表。
-
联合索引:使用联合索引覆盖多个查询条件。
-
索引选择性:选择性高的索引(唯一值多)回表次数少。
-
查询条件:查询条件覆盖的索引范围越小,回表次数越少。
-
延迟关联:在应用层进行数据过滤,减少数据库回表次数。
什么是覆盖索引?
覆盖索引是指一个索引包含了查询所需的所有列,这样在查询时可以直接从索引中获取数据,而不需要回表到数据表中查找,从而减少I/O操作,提高查询效率。
最左前缀匹配原则是什么?
最左前缀匹配原则指的是在使用联合索引时,查询条件必须按索引列的最左前缀顺序进行匹配,否则索引无法有效使用。例如,索引(a, b, c),查询条件必须至少包含a,才能使用索引;如果只包含b或c,则索引不生效。
索引什么时候会失效?
-
查询条件包含OR