上篇文章面试官:索引一般是如何实现的?MySQL InnoDB引擎的索引采用的是哪种数据结构?原因是什么呢?中,我们探讨了索引的实现方法,介绍了MySQL InnoDB引擎下索引的B+树数据结构。面试中,索引的可考察点还有很多,比如索引的类型、什么是聚簇索引、什么是覆盖索引、索引失效、索引下推等等,今天就继续聊下索引类型相关的面试题目。

面试官:索引都有哪些类型?

1、按照数据的存储位置分类

(1)聚簇索引

聚簇索引,数据和索引存储在一起,叶子节点中即存储了实际的数据行。在MySQL的InnoDB存储引擎中,每个表都有一个聚簇索引,默认情况下,如果一个表没有明确指定主键,InnoDB会自动选择一个唯一且非空的索引作为聚簇索引;如果不存在这样的索引,则InnoDB会隐式地创建一个名为ROWID的隐藏列作为聚簇索引。

聚簇索引的优势在于,由于数据和索引在一起,查询时能够更快地获取到所需的数据,效率更高。

(2)二级索引(非聚簇索引)

二级索引,又称非聚簇索引与聚簇索引相对,其叶子节点不包含实际的数据行,而是存储指向对应数据行的指针(在InnoDB中通常是一个书签记录,即聚簇索引的键值)。这意味着,通过非聚簇索引查找数据需要先查找到索引的叶子节点,再根据叶子节点中的指针找到实际的数据行,这被称为回表操作。非聚簇索引适用于多种场景,特别是当需要快速检索非主键列时。

2、按照索引字段的特性分类

(1)主键索引

主键索引,简单来说就是建立在主键列上的索引。它是一种特殊的唯一索引,一个表只能有一个主键且不允许有空值;索引列只能出现一次且必须唯一。

当在表中定义主键时,数据库会自动为该列创建索引,以提高数据访问速度。

CREATE TABLE table_name  (  ....  PRIMARY KEY (index_column_1));

(2)普通索引

普通索引是最基本的索引类型,没有唯一性的限制,可以创建在任何数据类型列上,为表中的一列或多列数据创建索引,以提高查询效率。这种类型的索引适用于需要提升查询速度但不强制要求数据唯一性的场景。

CREATE TABLE table_name  (  ....INDEX(idx_column_1,idx_column_2,...) );

(3)唯一索引

唯一索引要求索引列的值必须唯一,但允许有空值(NULL)。如果试图插入重复的值,则操作会失败,从而确保数据的唯一性。这不仅有助于数据完整性,还可以加速查找速度,尤其是当经常需要基于该列进行等值查询时。主键索引是一种特殊的唯一索引,它还附加了非空约束,意味着主键列既不能有重复值也不能为NULL。

CREATE TABLE table_name  (  ....UNIQUE KEY(idx_column_1,idx_column_2,...) );

(4)前缀索引

前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时指定),这样建立起来的索引更小,所以查询更快,但需要注意使用前缀搜索的场景,如 like 'abc%'这样的查询。

CREATE TABLE table_name(    ...INDEX(column_name(length))); 

(5)全文索引

全文索引是专门用于全文搜索的索引类型,可以极大地加速对文本内容的查询速度。在MySQL中,全文索引主要适用于MyISAM 和 InnoDB存储引擎(InnoDB引擎是 MySQL5.6 之后支持的),特别适合处理大量文本数据的搜索,如博客文章、新闻内容等。在MySQL中,全文索引只能应用于CHAR、VARCHAR和TEXT类型的列,并且默认只对英文有效,但可以通过配置支持其他语言。

CREATEFULLTEXTINDEX`idx_column_1`ontable_name(column_1);

面试官:主键索引一定是聚簇索引吗?

在MySQL中,聚簇索引是在InnoDB存储引擎中实现的,而在MyISAM存储引擎中,索引和数据是分开存储的,不支持真正的聚簇索引。

在InnoDB存储引擎中,表的主键会自动成为聚簇索引,如果没有显式定义主键,InnoDB会选择一个唯一的非空索引代替,如果也没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。聚簇索引的叶子节点包含行数据本身。

因此,MySQLInnoDB引擎中的主键索引一定是聚簇索引

面试官:什么是覆盖索引?

如果一个索引包含了查询所需要的所有列,那么这个索引就被称为覆盖索引。这意味着数据库可以直接从索引中获取所有信息,而不需要「回表」去查找实际的数据行。

使用覆盖索引的优点是:

1、减少了查询操作的 I/O 成本,显著提高查询效率。

2、特别适合于SELECT语句只需读取索引中已有的列,而无需访问实际数据行的情况。

如果要利用上覆盖索引,需确保查询的语句涉及的所有列都包含在某个索引中,并且该索引能够被优化器选择使用。

面试官:索引是越多越好吗?

建立索引的数量并不是越多越好的。索引可以加快数据检索的速度,但过多的索引可能会导致以下问题:

1、写操作性能下降:每次插入、更新或删除操作都需要更新索引,如果有太多的索引,这些操作会变得更加耗时。

2、存储空间占用增加:每个索引都需要一定的存储空间,过多的索引会增加数据库的存储成本。

3、索引维护成本增加:随着索引数量的增加,索引的维护成本也会增加,包括优化、重建索引等操作。

所以,我们需要根据实际情况和业务需求来合理地选择建立索引,避免过度索引的问题。

结语

理解聚簇索引、二级索引及覆盖索引的概念对于优化数据库性能至关重要,也是面试官考察候选人索引知识的重点。聚簇索引直接决定了数据的存储方式,二级索引则提供了额外的访问路径,而覆盖索引则是提高特定查询效率的有效手段。

在设计数据库索引时,应根据实际的查询模式和性能需求,合理选择和组合这些索引类型,以达到最佳的性能优化效果。

下次我们继续聊索引相关的内容,包括索引失效、最左匹配原则和索引下推等,敬请期待。

笔者刚创建了一个面试互助&技术交流群,微服务框架开源大牛助阵,有问必答,欢迎大家扫码加入,一起学习交流!

点击关注我,交个朋友吧!

本篇文章来源于微信公众号: 程序员Aike



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-08-02