Mysql索引的优点、缺点、分类及使用方法

article/2025/6/10 4:52:09

文章目录

  • 一、前言
  • 二、优点
  • 三、缺点
  • 四、分类及创建方式
    • 1.功能上分类
      • <1>普通索引
      • <2>唯一索引
      • <3>主键索引
      • <4>全文索引
      • <5>空间索引
    • 2.物理实现上分类
      • <1>聚簇索引
      • <2>非聚簇索引【二级索引、辅助索引】
      • <3>二者区别
    • 3.字段个数上分类
      • <1>单列索引
      • <2>联合索引
  • 五、其他操作
    • 1.删除索引
    • 2.查看索引
    • 3.查看某条sql是否用到了索引


一、前言

1.索引是一种可以帮助 Mysql 高效获取数据的数据结构,目的是为了减少磁盘I/O次数,加快查询速度
2.索引是在存储引擎中实现的,每种存储引擎实现索引的方式可能不通,其中Mysql的InnoDB引擎的索引底层采用B+树算法实现
3.所有存储引擎支持每个表至少16个索引,总索引长度至少为256个字节


二、优点

1.降低数据库I/O成本
2.对有依赖关系的子表和父表联合查询时,可以提高查询速度
3.在使用 group by 或者 order by 查询数据时,可以显著减少分组和排序的时间


三、缺点

1.创建和维护索引会耗费时间
2.索引存储文件会占用磁盘空间
3.大大提高表查询效率的同时会降低表更新效率【增删改的效率会被降低】


四、分类及创建方式

1.功能上分类

<1>普通索引

不附加任何限制条件,只用于提高查询效率,可以在任何字段上创建

# 建表时创建索引
CREATE TABLE book (id int NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,# title字段创建普通索引 ---INDEX idx_title(title)# ----------------------);# 为已创建的表添加索引
ALTER TABLE book ADD INDEX idx_title(title);
# 或者
CREATE INDEX idx_title ON book(title);

<2>唯一索引

字段添加 UNIQUE 参数即设置为唯一索引,该索引字段必须唯一,但可以有空值,一张数据表可以有多个唯一索引

# 建表时创建索引
CREATE TABLE book (id int NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,# title字段创建唯一索引 --------# 作用于电话号码、身份证号等字段时很实用UNIQUE INDEX idx_title(title)# ----------------------------);# 为已创建的表添加索引
ALTER TABLE book ADD UNIQUE INDEX idx_title(title);
# 或者
CREATE UNIQUE INDEX idx_title ON book(title);

<3>主键索引

主键索引是一种特殊的唯一索引,在主键索引的基础上增加不为空的约束,也就是 NOT NULL + UNIQUE ,一张表只能有一个主键索引

# 建表时创建索引
CREATE TABLE book (# 创建主键索引 ---------------------id int PRIMARY KEY AUTO_INCREMENT,# --------------------------------title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE, 
);

<4>全文索引

字段添加 FULLTEXT 可以设置为全文索引,只能创建在 char、vachar 或 text 类型的字段上,查询数据量较大的文本信息时可以提高查询速度【不过当数据量巨大的时候,还是需要用ElasticSearch】

# 建表时创建索引
CREATE TABLE book (id int NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,# title字段创建全文索引 --------------------# 使用title字段的前50个字符创建全文索引FULLTEXT INDEX futxt_idx_title(title(50))# ---------------------------------------);# 为已创建的表添加索引
ALTER TABLE book ADD FULLTEXT INDEX futxt_idx_title(title(50));
# 或者
CREATE FULLTEXT INDEX futxt_idx_title ON book(title(50));# 检索方式
SELECT * FROM book WHERE MATCH(title) AGAINST ("白夜行")
# 建表时创建索引
CREATE TABLE book (id int NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,# title字段创建全文索引 ------------------------------# 使用title、author字段创建全文索引FULLTEXT INDEX futxt_idx_title_author(title, author)# --------------------------------------------------);# 为已创建的表添加索引
ALTER TABLE book ADD FULLTEXT INDEX futxt_idx_title_author(title, author);
# 或者
CREATE FULLTEXT INDEX futxt_idx_title_author ON book(title, author);# 检索方式
SELECT * FROM book WHERE MATCH(title, author) AGAINST ("白夜行")

<5>空间索引

InnoDB不支持,本人水平有限暂时没用到,就不做阐述了


2.物理实现上分类

InnoDB的索引分为两种

<1>聚簇索引

基于主键id搭建的B+树,索引和数据不分家,所有用户记录都保存在了叶子结点,可以说是 索引即数据,数据即索引
聚簇索引不需要用户显式的创建,而是插入数据的时候有数据引擎自动创建,正是因此,当id为查询条件时,查询速度会得到显著的提升
在这里插入图片描述

<2>非聚簇索引【二级索引、辅助索引】

基于指定字段搭建的B+树,仅有指定字段和主键,没有其他数据,索引和数据是分开的,当mysql根据指定字段的非聚簇索引找到对应数据后,需要通过非聚簇索引对应的主键在聚簇索引中查出数据【这个操作叫做回表】,可以说是 索引是索引,数据是数据【旺柴】
非聚簇索引需要用户显式创建
在这里插入图片描述
ps:非聚簇索引还有个特殊情况就是联合索引,是基于多个指定字段搭建的B+树,可提高多条件查询的效率

<3>二者区别

1.聚簇索引叶子结点存储的是数据,非聚簇索引叶子结点存储的是数据位置
2.一个表只能有一个聚簇索引【因为只能有一种排序存储方式】,但是可以有多个非聚簇索引
3.聚簇索引在查询时效率高【不需要进行回表查询】,非聚簇索引在增删改时效率高【不需要更新数据】


3.字段个数上分类

<1>单列索引

一个索引只对应一个字段【包括普通索引、唯一索引等】

# 建表时创建索引
CREATE TABLE book (id int NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,# title字段创建单列索引 ---INDEX idx_title(title)# ----------------------);# 为已创建的表添加索引
ALTER TABLE book ADD INDEX idx_title(title);
# 或者
CREATE INDEX idx_title ON book(title);

<2>联合索引

一个索引对应多个字段

# 建表时创建索引
CREATE TABLE book (id int NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL,author varchar(50) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,# title、author字段创建联合索引 -------INDEX mul_idx_title_author(title, author)# -----------------------------------);# 为已创建的表添加索引
ALTER TABLE book ADD INDEX mul_idx_title_author(title, author);
# 或者
CREATE INDEX mul_idx_title_author ON book(title, author);

重点:联合索引的多个字段在查询时一定要注意sql中的查询字段,比如上面那个联合索引,如果使用下面这种查询方法,实际上是用不到索引的

SELECT * FROM book WHERE author="东野圭吾";

但是下面这两条却可以用到索引

SELECT * FROM book WHERE title="白夜行";
SELECT * FROM book WHERE title="白夜行" and author="东野圭吾";

也就是说,创建联合索引时,是按照你给定的字段顺序创建B+树的,查询的时候后面的字段依赖于前面的字段【称为最左前缀原则】,如果只有后面的字段没有前面的字段,那么查询时将不会使用索引


五、其他操作

1.删除索引

# 删除 book 表的 idx_title 索引
DROP INDEX idx_title ON book

2.查看索引

# 查看 book 表已创建的索引
SHOW INDEX FROM book;

3.查看某条sql是否用到了索引

# 性能分析工具,可以查看这条sql是否用到了索引
EXPLAIN SELECT * FROM book WHERE title = "高等数学";

在这里插入图片描述



http://chatgpt.dhexx.cn/article/OycTVMbY.shtml

相关文章

关闭端口命令,如何关闭电脑80端口

有很多用户都知道80端口是上网使用最多的协议&#xff0c;网页服务默认端口都是80&#xff0c;不过有一些木马专门针对80端口攻击计算机&#xff0c;为了保证电脑的安全&#xff0c;很多用户都会把80端口关闭&#xff0c;那么如何关闭80端口呢?下面&#xff0c;小编给大家用ii…

windows中使用命令查看端口和关闭端口进程

1.windowsr 输入cmd 打开命令提示符 2.输入 netstat -ano |findstr &#xff08;需要关闭的端口&#xff09; 3.输入taskkill /t /f /pid (根据端口得到的进程号)或 taskkill /pid 13324 -t -f

Mac如何关闭指定端口

命令很简单&#xff0c;但每次都记不住&#xff0c;都要去查。。。 背景就是项目运行过程中想重新打包&#xff0c;因为上一个进程没结束掉&#xff0c;导致原来的端口被占用掉了&#xff0c;打包提示我新开一个端口&#xff0c;但是我就是想要原来的端口&#xff08;主要是不…

如何禁用计算机开放的端口,关闭端口命令,教您如何关闭电脑80端口

有很多用户都知道80端口是上网使用最多的协议&#xff0c;网页服务默认端口都是80&#xff0c;不过有一些木马专门针对80端口攻击计算机&#xff0c;为了保证电脑的安全&#xff0c;很多用户都会把80端口关闭&#xff0c;那么如何关闭80端口呢?下面&#xff0c;小编给大家分享…

Windows 和 Linux 查看和关闭端口常用命令解析

1. Windows 常用命令 查看系统当前所有的端口使用情况 netstat -ano查看端口被哪个应用占用 netstat -ano|findstr "端口号"查看端口信息 tasklist|findstr "端口号"关闭端口 taskkill /pid "端口号" -t -f2. Linux 常用命令 Linux系统查看…

GSL中的IEEE浮点算术

IEEE浮点算术 本章描述用于检查浮点数表示和控制程序的浮点环境的函数。本章描述的函数声明在头文件gsl_ieee_utils.h中。 47.1 浮点数的表示 IEEE二进制浮点算法标准定义了单精度数和双精度数的二进制格式。每个数字由三部分组成&#xff1a;一个符号位(s)&#xff0c;一个指…

IEEE-754 64位双精度浮点数存储详解

IEEE-754双精度浮点数 IEEE二进制浮点数算术标准&#xff08;IEEE 754&#xff09;规定了四种表示浮点数值的方式&#xff1a;单精确度&#xff08;32位&#xff09;、双精确度&#xff08;64位&#xff09;、延伸单精确度&#xff08;43比特以上&#xff0c;很少使用&#xf…

CSAPP学习记录-IEEE浮点表示

使用二进制定点表示浮点数十分麻烦&#xff0c;且由于有些浮点数的二进制不能精确表示&#xff0c;只能添加小数位数不断近似&#xff0c;使得位数开销极大。20世纪70年代已经有一些计算机厂家推出了自己的浮点数表示标准&#xff0c;但并不统一&#xff0c;于是在1985年IEEE 7…

聊一聊 IEEE754 标准(里面涉及浮点数精度丢失问题)

一、什么是 IEEE754 标准 IEEE 二进制浮点数算术标准&#xff08;IEEE 754&#xff09;是 20 世纪 80 年代以来最广泛使用的浮点数运算标准&#xff0c;为许多 CPU 与浮点运算器所采用。IEEE754 标准提供了如何在计算机内存中&#xff0c;以二进制的方式存储十进制浮点数的具体…

【算法】解析IEEE 754 标准

目录结构&#xff1a; contents structure [-] 浮点数的存储过程 次正规数&#xff08;Denormalized Number&#xff09;零&#xff08;zero&#xff09;非数值&#xff08;NaN&#xff09;无穷大&#xff08;infinity&#xff09;除数为0.0会发生什么浮点数的范围浮点数的精度…

如何深刻理解IEEE浮点数的表示(IEEE floating-point representation)

引言 大家都知道&#xff0c;可以在计算机处理器直接运行的是由0,1构成的机器代码(machine code)&#xff0c;本文将介绍浮点数(floating-point number )在机器码中是如何被编码表示的。 整数(integer)是如何被编码的呢&#xff1f;小伙伴们应该听过补码&#xff0c;原码&…

【论文学习】7、ieee802.11ah中基于深度学习的载波频偏估计

摘要 基于ieee802.11标准的Wi-Fi系统是最流行的无线接口&#xff0c;它采用先听后讲&#xff08;LBT&#xff09;的方式进行信道接入。大多数基于LBT的系统的显著特征是&#xff0c;发射机使用在数据之前的前导码来允许接收机执行分组检测和载波频率偏移&#xff08;CFO&#…

计算机中的小数 IEEE754

计算机中的小数 IEEE754 进制计数系统 在基数b的位置记数系统(其中b是一个正自然数&#xff0c;叫做基数)&#xff0c;b个基本符号(或者叫数字)对应于包括0的最小b个自然数。 要产生其他的数&#xff0c;符号在数中的位置要被用到。最后一位的符号用它本身的值&#xff0c;向…

计算机组成原理:IEEE754标准中,为什么指数真值e变成阶码加上的偏移值是127不是128?

1.浮点数在计算机里的存储方式 以32位为例,短浮点型float,按照按照 IEEE754 标准,在计算机里的存储格式如下 数符S&#xff1a;表示浮点数的符号&#xff0c;占1位&#xff0c;0—正数、1—负数&#xff1b; 尾数M&#xff1a;23位&#xff0c;原码纯小数表示&#xff0c;小数…

ieee sci 期刊 写作经验 分享 博士发展阶段

0. 前言 本文仅记录最近我在论文写作中遇到的问题&#xff08;感谢老师、师兄的用心指导&#xff09;&#xff0c;仅仅是我的个人分享&#xff0c;不适用于所有人。 1. introduction - 如何切入自己的工作&#xff1f; 1.1 不要没事找事 例子&#xff1a; 比如你做的是目标…

谈谈论文的发表(电光与控制,IEEE ACCESS)

前言 目前&#xff0c;科研任务差不多告一段落&#xff0c;总结一下发表论文的经验以及经历。 2021年3月&#xff0c;录用IEEE ACCESS一篇&#xff0c;本来老师想让投IEEE trans系列&#xff0c;但是工作的深度差一点&#xff0c;并且没有很好的实例论证&#xff0c;只有仿真&…

IEEE 754标准

普通规则下: 移码: 补码的基础上将符号位取反。注意:移码只能用于表示整数 移码的定义: 移码 真值 偏置值(确定移码&#xff0c;首先要确定偏置值) 偏置值一般取2^n-1&#xff0c;此时移码 补码符号位取反 IEEE 754规则下&#xff1a; 偏置值 2^n-1 - 1 相当于将普通规…

IEEE 754浮点数工业标准

文章目录 浮点数概述浮点数的格式IEEE 754标准规定的浮点数的格式IEEE 754偏移量与指数范围问题IEEE 754中浮点数值的三种情况&#xff1a;1. 规格化的浮点数的值2. 非规格化的值3. 特殊值 Java中的浮点数类型 浮点数概述 浮点数&#xff0c;是属于有理数中某特定子集的数的数字…