一架梯子,一头程序猿,仰望星空!
MySQL性能优化面试题 > 内容正文

什么是索引?MYSQL有哪些索引类型?


问题简答

1、索引(Index)是一种数据结构,用于快速定位关键字(Key)对应的记录(Row),类比字典中的目录索引,通过索引我们可以快速定位到所需要的内容。
2、在数据库中,索引通常用于数据的查找、排序、分组和连接等操作,减少数据库扫描数据的次数,从而提高数据库的查询效率。

问题详解:

从存储结构和逻辑两个角度MYSQL索引区别如下:

1.存储结构角度分类

1.1.B-Tree索引

B-Tree索引是MySQL默认的索引类型,适用于全键值、键值范围查找和排序查询,可以高效支持多种查询方式。B-Tree索引按照节点的数量和层级关系构建索引,每个节点存储多个键值,包括叶子节点和非叶子节点。

1.2.Hash索引

Hash索引适用于等值查询,不支持范围查询和排序操作。Hash索引是通过哈希函数计算索引列值的散列值,将散列值映射到索引表中的一个地址上,因此哈希索引查询速度快,但只适用于精确匹配查询。MySQL中只有Memory存储引擎支持Hash索引。

提示:Innodb存储引擎可以创建hash索引不会报错,但是如果show index查看索引,会发现实际还是使用btree索引。

1.3.Full-Text索引

Full-Text索引适用于全文检索,主要用于文本类型的字段。Full-Text索引会对文本进行分词,并建立索引,支持自然语言的查询方式,可以找出包含特定关键字的行。Full-Text索引只能建立在MyISAM和InnoDB引擎的TEXT和VARCHAR类型的字段上。

1.4.R-Tree索引(空间索引)

MYSQL从5.7版本开始支持R-Tree索引,R-Tree索引主要用于空间数据的查询,如二维平面坐标、三维空间坐标等。R-Tree索引采用类似B-Tree的树型结构存储空间数据,可以快速查找满足条件的空间数据。

2.逻辑角度分类

2.1.主键索引

主键索引是一种特殊的唯一索引,用于保证表中每行数据的唯一性,并且不允许NULL值。主键索引对于InnoDB引擎来说非常重要,因为它是InnoDB存储引擎聚簇索引的主键部分,因此在选择主键时要注意选取短、稳定、唯一的列。

2.2.唯一索引

唯一索引用于保证索引列的唯一性,与主键索引不同的是,唯一索引允许NULL值。

2.3.普通索引

普通索引是最基本的索引类型,可以加速各种类型的查询,包括等值查询、范围查询和排序操作。

2.4.组合索引

组合索引是将多个列作为一个索引,可以加快多列查询的速度。组合索引的列顺序非常重要,需要根据实际情况选择合适的列顺序。

3.聚族索引和非聚簇索引

聚簇索引和非聚簇索引是基于存储方式来分类的。聚簇索引将数据行存储在同一块中,而非聚簇索引则将数据行和索引分开存储。前面章节2提到的索引可以是聚族索引,也可以是非聚簇索引。

3.1.聚簇索引

也叫聚集索引,是将数据按照索引键的顺序来组织的一种索引类型。具体地说,聚簇索引把数据行存储在索引的叶子节点上,而非聚簇索引则将数据行存储在另外一片区域中,并且该区域是按照非索引键顺序来组织的。

以MYSQL InnoDB存储引擎为例,InnoDB使用B+树作为索引结构,每个索引都有一个根节点、若干个中间节点和若干个叶子节点。在InnoDB中,每个表只能有一个聚簇索引,而且聚簇索引的键值就是该表的主键。这意味着,如果一个表没有主键,InnoDB将自动创建一个隐藏的主键作为聚簇索引。

3.2.非聚簇索引

非聚簇索引则是指将索引和数据分别存储的一种索引类型。非聚簇索引会把索引列以及指向相应数据行的指针存储在一个独立的数据结构中,不同于聚簇索引将数据行直接存储在索引结构中。因此,查询数据时,非聚簇索引需要先查找索引,再根据指针到数据区域查找数据。