Skip to content

面经精选:数据库高频面试十问

1.InnoDB和MyISAM存储引擎的区别?

MySQL 默认的存储引擎是 InnoDB,它采用 B+Tree 作为索引的数据结构。

在创建表时,InnoDB 存储引擎默认会创建一个主键索引,也就是聚簇索引,其它索引都属于二级索引。

MySQL 的 MyISAM 存储引擎支持多种索引数据结构,比如 B+ 树索引、R 树索引、Full-Text 索引。MyISAM 存储引擎在创建表时,创建的主键索引默认使用的是 B+ 树索引。

InnoDB存储引擎有2个文件:Frm文件和Ibd文件。Frm文件是表的定义文件,而Ibd文件是数据和索引存储文件(数据以主键进行聚集索引,把真正的数据保存在叶子节点中)。

MyISAM存储引擎有3个文件:Frm文件、MYD文件和MYI文件。Frm文件是表的定义文件,MYD文件是数据文件(所有的数据保存在这个文件中),MYI文件是索引文件。

综上所述,InnoDB 和 MyISAM 都支持 B+ 树索引,但是它们数据的存储结构实现方式不同。不同之处在于:

  • InnoDB 存储引擎:B+ 树索引的叶子节点保存数据本身,即数据和索引都放在一个文件中;
  • MyISAM 存储引擎:B+ 树索引的叶子节点保存数据的物理地址,即两个文件分开存储;

2.聚合索引和非聚合索引的区别,以及各自的优缺点?

InnoDB 存储引擎根据索引类型不同,分为聚簇索引(上图就是聚簇索引)和二级索引。它们区别在于,聚簇索引的叶子节点存放的是实际数据,所有完整的用户数据都存放在聚簇索引的叶子节点,而二级索引的叶子节点存放的是主键值,而不是实际数据

聚簇索引的优点:

  • 当你需要取出一定范围内的数据时,用聚簇索引比用非聚簇索引好
  • 数据访问更快,聚集索引将索引和数据保存在同一个B-Tree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快。
  • 当通过聚簇索引查找目标数据时理论上比非聚簇索引要快,因为非聚簇索引定位到对应主键时可能还要多一次回表操作
  • 使用覆盖索引扫描的查询可以直接使用叶节点中的主键值

聚簇索引的缺点:

  • 插入速度严重依赖于插入顺序
  • 更新主键的代价很高,因为将会导致被更新的行移动

非聚簇索引的优点:

  • 插入和更新数据时不需要移动其他数据行,因此性能较好。
  • 非聚簇索引能够加速数据查询,提高查询速度。

非聚簇索引的缺点:

  • 查询非索引列的时候,需要进行二次查找,因此相对于聚簇索引,查询速度较慢。
  • 非聚簇索引的叶子节点不存储数据行,因此对于需要查询全部列的查询语句,需要进行额外的I/O操作,降低查询效率。

3.索引失效情景?

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。
  • 如果查询条件中对索引字段使用函数,就会导致索引失效。
  • 在查询条件中对索引进行表达式计算,也是无法走索引的。
  • 如果索引字段是字符串类型,但是在条件查询中,输入的参数是整型的话会发生隐式类型转换,此时也是没法走索引的。
  • 如果不符合最左匹配原则,也就无法匹配上联合索引,联合索引就会失效。
  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。