MySQL 的索引类型有哪些?

索引是帮助MySQL高效获取数据的数据结构。就像书本的目录一样,可以快速定位到需要查找的内容。以下是MySQL中索引的主要分类和详解。

一、按数据结构划分

这是最核心的分类方式,决定了索引的底层实现和适用场景。

  1. B+Tree索引
    • 描述:这是MySQL中最常用、最主流的索引类型。InnoDBMyISAM存储引擎都支持B+Tree索引。
    • 特点
      • 有序性:数据存储在叶子节点上,并且叶子节点之间通过指针相连,形成一个有序链表,非常适合范围查询(如 WHERE id > 10)。
      • 矮胖平衡树:树的高度低,意味着通常只需要很少的磁盘I/O就能找到目标数据。
    • 适用场景:几乎适用于所有需要索引的场景,特别是主键索引和范围查询。
  2. 哈希索引
    • 描述:基于哈希表实现,只有精确匹配所有列的查询才有效。Memory存储引擎默认支持哈希索引。InnoDB也支持自适应哈希索引,但这是数据库内部自动管理的。
    • 特点
      • 查询极快:对于等值查询(=),速度通常比B+Tree索引更快。
      • 无序:不支持范围查询和排序。
      • 不支持最左前缀匹配原则
    • 适用场景:只适用于等值查询,且数据重复度低的列。
  3. 全文索引
    • 描述:用于查找文本中的关键词,类似于搜索引擎。它解决的是LIKE '%keyword%'查询效率低下的问题。
    • 特点
      • 适用于CHARVARCHARTEXT类型的列。
      • 有自己的一套分词和匹配规则。
    • 适用场景:在大量的文本数据中搜索关键词。
  4. R-Tree索引(空间索引)
    • 描述:主要用于地理空间数据类型,如 GEOMETRY
    • 特点:支持对空间数据进行高效查询,例如“查找附近的所有地点”。
    • 适用场景:地理信息系统(GIS)。

二、按物理存储划分(聚集 vs 非聚集)

这个分类主要针对B+Tree索引,描述了数据行和索引的存储关系。

  1. 聚集索引
    • 描述表数据本身(数据行)就按照索引的键值顺序存储在叶子节点上。一张表只能有一个聚集索引。
    • 在InnoDB中
      • 如果定义了主键,主键就是聚集索引。
      • 如果没有主键,则选择第一个UNIQUE且非空的列作为聚集索引。
      • 如果都没有,InnoDB会隐式创建一个隐藏的列作为聚集索引。
    • 优点:因为数据行直接存储在索引中,所以通过主键查询非常高效。
  2. 非聚集索引(二级索引/辅助索引)
    • 描述:索引的叶子节点不包含完整的数据行,而是存储了指向数据行的指针(在InnoDB中,这个指针是主键的值)。一张表可以有多个非聚集索引。
    • 查询过程:当通过非聚集索引查询时,需要先找到对应的主键值,然后再回到聚集索引(主键索引)中去查找完整的数据行,这个过程称为回表

三、按逻辑功能/字段特性划分

这个分类是根据索引作用的字段的特性和约束来划分的。

  1. 主键索引
    • 一种特殊的唯一索引,不允许有空值。每个表只能有一个主键索引。在InnoDB中,它就是聚集索引。
  2. 唯一索引
    • 索引列的值必须唯一,但允许有空值(NULL)。一张表可以有多个唯一索引。
  3. 普通索引
    • 最基本的索引类型,没有任何唯一性限制,仅仅是为了提高查询速度。
  4. 前缀索引
    • 当索引的列是字符串时,可以只对列的前n个字符建立索引,以节省空间。例如:INDEX (column_name(n))
  5. 复合索引(联合索引)
    • 一个索引包含多个列。查询时遵循最左前缀匹配原则,即从索引的最左边列开始匹配。例如,索引是 (A, B, C),那么查询条件包含 AA,BA,B,C时索引才会生效。


作 者:南烛
链 接:https://www.itnotes.top/archives/869
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇