面经精选:数据库高频面试十问
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 后的条件列不是索引列,那么索引会失效。
