MySQL中索引的分类详解

 更新时间:2023年08月25日 09:31:48   作者:谁是黄黄  
这篇文章主要介绍了MySQL中索引的分类详解,普通索引就是最基础的索引,这种索引没有任何的约束作用,它存在的主要意义就是提高查询效率,唯一性索引是在普通索引的基础上增加了数据唯一性的约束,一个表中可以有多个,需要的朋友可以参考下

一.按照功能划分

按照功能划分的话,索引分为四种:

1.普通索引

2.唯一索引

3.主键索引

4.全文索引

1.1 普通索引

CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

普通索引 :普通索引就是最基础的索引,这种索引没有任何的约束作用,它存在的主要意义就是提高查询效率。

在上述表中: name字段就是一个普通索引。

1.2 唯一性索引

CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

唯一性索引 : 在 普通索引的基础上增加了数据唯一性的约束 。 一个表中可以有多个。

在上述表中 :name字段就是唯一性索引。

1.3 主键索引

主键索引则是在唯一性索引的基础上又增加了不为空的约束,则 NOT NULL+UNIQUE ,一张表中最多只有一个主键索引,但是一个主键索引中可以包含多个字段。

1.4 全文索引

一般很少用到。

二.按照功能划分

聚集索引

聚集索引 在存储的时候,可以按照主键(不是必须,看情况)来排序存储数据,B+Tree 的叶子结点就是完整的数据行,查找的时候,找到了主键也就找到了完整的数据行。

在聚集索引里,表中数据行按索引的排序方式进行存储,对查找行很有效。

只有当表包含聚集索引时,表内的数据行才会按找索引列的值在磁盘上进行物理排序和存储。

每张表只能有一个聚集索引,原因很简单,因为数据行本身只能按一个顺序存储。

当我们基于 InnoDB 引擎创建一张表的时候,都会创建一个聚集索引,每张表都有唯一的聚集索引:

1. 如果这张表定义了主键索引,那么这个主键索引就作为聚集索引。

2. 如果这张表没有定义主键索引,那么该表的第一个唯一非空索引作为聚集索引。

3. 如果这张表也没有唯一非空索引,那么 InnoDB 内部会生成一个隐藏的主键

作为聚集索引,这个隐藏的主键是一个 6 个字节的列,该列的值会随着数据的插入自增。

非聚集索引

非聚集索引我们一般也称为 二级索引或者辅助索引 ,对于非聚集索引,数据库会 有单独的存储空间来存放 。

非聚集索引在查找的时候要经过两个步骤,例如执行select * from user where username=‘aaa’ (假设 username 字段是非聚集索引)。

1.先搜索 username 这一列索引的 B+Tree,这个 B+Tree 的叶子结点存储的不是完整的数据行,而是主键值。

2.拿着主键值再去搜索主键索引的 B+Tree,就可以获取到一行完整的数据。

所以如果我们在查询中用到了非聚集索引,那么就会搜索两棵 B+Tree,第一次搜索 B+Tree 拿到主键值后再去搜索聚集索引的 B+Tree,这个过程就是所谓的 回表 。

一张表只能有一个聚集索引,但可以有多个非聚集索引。

使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。

相关文章

  • MySQL5.7配置Pseudo-GTID完整步骤

    MySQL5.7配置Pseudo-GTID完整步骤

    本文主要介绍了MySQL5.7配置Pseudo-GTID完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • MySQL详解如何优化查询条件

    MySQL详解如何优化查询条件

    我们知道从MySQL表中使用SELECT语句来查询数据,如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句中,本篇我们来看看怎样优化查询条件
    2022-05-05
  • MySQL 压缩的使用场景和解决方案

    MySQL 压缩的使用场景和解决方案

    数据分布特点,决定了空间压缩的效率,如果存入的数据的重复率较高,其压缩率就会较高;通常情况下字符类型数据(CHAR, VARCHAR, TEXT or BLOB )具有较高的压缩率,而一些二进制数据或者一些已经压缩过的数据的压缩率不会很好
    2017-06-06
  • MySQL连表查询之笛卡尔积查询的详细过程讲解

    MySQL连表查询之笛卡尔积查询的详细过程讲解

    在使用MySQL或任何关系型数据库进行多表查询时,如果连接条件设置不当,就可能发生所谓的笛卡尔积现象,这篇文章主要介绍了MySQL连表查询之笛卡尔积查询的相关资料,需要的朋友可以参考下
    2025-08-08
  • SQL优化老出错,那是你没弄明白MySQL解释计划用法

    SQL优化老出错,那是你没弄明白MySQL解释计划用法

    本篇文章讲的是SQL优化老出错,那是你没弄明白MySQL解释计划用法,有兴趣的小伙伴速度来看看吧,希望本篇文章能够帮助到你
    2021-11-11
  • MySQL非空约束(not null)案例讲解

    MySQL非空约束(not null)案例讲解

    这篇文章主要介绍了MySQL非空约束(not null)案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mysql 控制台程序的提示符 prompt 字符串设置

    mysql 控制台程序的提示符 prompt 字符串设置

    mysql 控制台程序的提示符 prompt 字符串设置,学习mysql的朋友可以参考下。
    2011-08-08
  • 获取缺失主键表信息的MYSQL语句

    获取缺失主键表信息的MYSQL语句

    如何获取缺失主键表信息,想必有些朋友还是不会的吧,下面为大家介绍下,可以通过几条语句实现,感兴趣的朋友可以了解下
    2013-06-06
  • MySQL命令无法输入中文问题的解决方式

    MySQL命令无法输入中文问题的解决方式

    这篇文章主要给大家介绍了关于MySQL命令无法输入中文问题的解决方式,文中给出了详细的解决方案,对遇到这个问题的同学有很大的帮助,需要的朋友可以参考下
    2021-08-08
  • 两种mysql对自增id重新从1排序的方法

    两种mysql对自增id重新从1排序的方法

    本文介绍了两种mysql对自增id重新从1排序的方法,简少了对于某个项目初始化数据的工作量,感兴趣的朋友可以参考下
    2015-07-07

最新评论