MySQL创建索引的方式详解、索引的删除、MySQL8.0降序索引

news2024/12/22 17:35:42

1、索引创建的方式

  • 方式1:创建表时指定索引列
  • 方式2:使用ALTER TABLE创建索引
  • 方式3:使用CREATE TABLE创建索引

2、表中索引查看的方式

  • 方式1:使用语句 SHOW INDEX FROM 表名; 语句查看表中的索引

如:

  • 方式2:使用语句 SHOW CREATE TABLE STUDENT01; 语句查看表的DDL语句,可以显式的看到索引的创建语句

如:

3、创建表时指定索引列

3.1、隐式的创建索引

  • 在声明有主键约束、唯一约束、外键约束的字段上,会自动的添加相关的索引
--创建学生表01,指定ID为主键,此时会自动添加主键索引
CREATE TABLE STUDENT01(
	ID INT PRIMARY KEY AUTO_INCREMENT
	,NAME VARCHAR(20) UNIQUE 
	,AGE INT
)
  • 查看表中索引方式1:
--查看当前表的索引
SHOW INDEX FROM STUDENT01;

索引结果如下:

  • 查看表中索引方式2:
SHOW CREATE TABLE STUDENT01;

结果如下:

  

注意:外键约束是一种表与表之间的约束,不是索引

外键案例:

--案例:
--创建TEACHER01表
CREATE TABLE TEACHER01(
	ID INT PRIMARY KEY AUTO_INCREMENT
	,NAME VARCHAR(20) UNIQUE 
)
--创建STUDENT18表,ID与TEACHER01表中的ID关联
CREATE TABLE STUDENT18(
	ID INT PRIMARY KEY AUTO_INCREMENT
	,NAME VARCHAR(20) UNIQUE 
	,AGE INT
	,CONSTRAINT STUDENT18_ID_FK FOREIGN KEY(ID) REFERENCES TEACHER01(ID)  --创建外键
)
--查看索引
SHOW INDEX FROM STUDENT18;

STUDENT18表中的索引结果:


3.2、显式的创建索引

语法格式:

CREATE TABLE 表名 (

        列名1  列类型1 ,

        列名2  列类型2 ,

        ...

         [UNIQUE | FULLTEXT | SPATIAL]  [INDEX | KEY]   索引名称(索引作用的列名[索引长度])  [DESC | AESC]

)

  • UNIQUE、FULLTEXT、SPATIAL:可选参数,分别表示唯一索引、全文索引、空间索引
  • INDEX与KEY是同义词:两者作用相同,用于指定创建索引
  • 索引名称:可选参数,如果省略,MySQL默认使用列名作为索引名称
  • 索引长度:可选参数,只有字符串类型的字段才能指定索引长度
  • ASC/DESC:指定索引值存储值是否降序还是升序
创建普通索引
--创建学生表02,指定NAME为普通索引
CREATE TABLE STUDENT02(
	ID INT
	,NAME VARCHAR(20)
	,AGE INT
	,INDEX idx_name(name)
)
--查看索引
SHOW INDEX FROM STUDENT02;

索引查询结果如下:

创建唯一索引(可以添加多个null值)
--创建学生表03,指定ID为唯一索引
CREATE TABLE STUDENT03(
	ID INT
	,NAME VARCHAR(20)
	,AGE INT
	,UNIQUE INDEX idx_name(ID)
)

测试唯一索引:

--给STUDENT03表插入3条数据
INSERT INTO STUDENT03(id,name,age)
VALUES(1,'张三',18);
INSERT INTO STUDENT03(id,name,age)
VALUES(null,'张三',18);
INSERT INTO STUDENT03(id,name,age)
VALUES(null,'张三',18);

--查看所有数据
SELECT * FROM STUDENT03;

结果如下:

 总结:唯一索引不能重复插入相同数据,但是可以添加多个null值

创建主键索引
  • 主键索引就是通过主键约束进行创建的,就是隐式创建索引的方式

删除主键索引:

ALTER TABLE 表名 DROP PRIMARY KEY;

注意:当主键是自增情况时,需要先删除自增,再删除主键

创建联合索引
--创建学生表04,指定NAME、AGE和SCORE为联合索引
CREATE TABLE STUDENT04(
	ID INT
	,NAME VARCHAR(20)
	,AGE INT
	,SCORE decimal
	,INDEX idx_name_age(NAME,AGE,SCORE)
);
--查看索引
SHOW INDEX FROM STUDENT04;

结果如下:

注意:

  • 由于索引创建时,字段顺序是NAME,AGE,SCORE ,因此B+树建立的顺序也是先按NAME安排,再按AGE排序,最后按SCORE排序
  • 最左前缀原则:如果想使用该联合索引,如果where条件中没有最左字段name,那么该索引失效

我们可以使用关键字EXPLAIN测试:

  • 测试1:where条件中包含了联合索引中的所有字段
--EXPLAIN 测试索引,where条件中使用了NAME,AGE,SCORE
EXPLAIN 
SELECT 
	* 
FROM STUDENT04 
WHERE
	NAME = '张三'
	AND AGE = 18
	AND SCORE = 85

结果如下:上述SQL语句使用了索引

  • 测试2:where条件中不包含了联合索引中的中间字段AGE
--EXPLAIN 测试索引,where条件中使用了NAME,SCORE,没有使用中间的字段AGE
EXPLAIN 
SELECT 
	* 
FROM STUDENT04 
WHERE
	NAME = '张三'
	AND SCORE = 85

结果如下:上述SQL语句使用了索引

  • 测试3:where条件中不包含了联合索引中最左字段name
EXPLAIN 
SELECT 
	* 
FROM STUDENT04 
WHERE
	AGE = 18
	AND SCORE = 85

结果如下:上述SQL语句索引失效

  • 测试4:给最左字段name,再创建唯一索引,测试使用的是单列索引还是联合索引

注意:这个测试必须保证表中存在数据,否则无法查看效果!

--给STUDENT04表插入3条数据
INSERT INTO STUDENT04(id,name,age,score)
VALUES(1,'张三',18,85);

INSERT INTO STUDENT04(id,name,age,score)
VALUES(1,'李四',18,85);

INSERT INTO STUDENT04(id,name,age,score)
VALUES(1,'王五',18,85);

--测试索引执行情况
EXPLAIN 
SELECT 
	* 
FROM STUDENT04 
WHERE
	NAME = '张三'
	AND AGE = 18
	AND SCORE = 85

结果如下:SQL语句使用了唯一索引,而不是联合索引

联合索引使用总结
  • 遵循最左前缀原则:当where条件中没有使用联合索引最左字段,那么索引失效 

根据B+树建立的原理:节点中的数据记录是按最左边的字段优先进行排序,再根据索引中其他字段的先后顺序,再进行排序,因此,如果where中没有使用最左边的字段作为条件,那么B+树节点的数据记录最开始的排序(入口)都没有使用,那后面排序的字段也就无法生效,从而导致索引失效

  • where条件中的字段的先后顺序不会影响联合索引
  • where条件中,只要使用了最左边的字段,那么联合索引生效
  • 当一个表有多条索引可走,那么会根据优化器的查询成本来选择走哪个索引

4、表创建后,使用ALTER TABLE添加索引

语法:

ALTER  TABLE  表名  ADD  [索引类型]   INDEX   索引名称(作用的字段名称);

  • 索引名称可以省略
  • [索引类型] :可以省略,省略就是普通索引,如果指定索引类型,那么INDEX也可以省略

如:

CREATE TABLE STUDENT05(
	ID INT
	,NAME VARCHAR(20) 
	,AGE INT
	,SCORE decimal
);

--给STUDENT05表SCORE字段创建普通索引
ALTER TABLE STUDENT05 ADD INDEX (score);
--给STUDENT05表NAME字段创建唯一索引
ALTER TABLE STUDENT05 ADD UNIQUE IDX_NAME(NAME);

--给STUDENT05表NAME,AGE,SCORE字段创建联合索引
ALTER TABLE STUDENT05 ADD INDEX IDX_NAME_AGE_SCORE(NAME,AGE,SCORE);

5、表创建后,使用CREATE INDEX添加索引

语法:

CREATE  [索引类型]   INDEX  索引名称   ON   表名(作用的字段名称);

  • 索引类型可省略
  • 索引名称不能省略
  • INDEX关键字不可省略

如:

CREATE TABLE STUDENT06(
	ID INT
	,NAME VARCHAR(20) 
	,AGE INT
	,SCORE decimal
);

--给STUDENT06表SCORE字段创建普通索引
CREATE INDEX idx_score ON STUDENT06(SCORE);

--给STUDENT06表NAME字段创建唯一索引
CREATE UNIQUE INDEX idx_name ON STUDENT06(NAME);

--给STUDENT05表NAME,AGE,SCORE字段创建联合索引
CREATE UNIQUE INDEX IDX_NAME_AGE_SCORE ON STUDENT06(NAME,AGE,SCORE);

6、ALTER TABLE方式与CREATE INDEX方式的区别

  • ALTER方式创建非普通索引时,INDEX关键字可以省略,而CREATE方式INDEX不可省略
  • ALTER方式可以不指定索引名称,默认使用字段名作为索引名称,而CREATE方式索引名称不可省略

7、索引的删除

索引删除场景:

  • 表索引数量多,当需要大量增删改时,可以先删除索引,再删除数据

方式1:

ALTER  TABLE  表名称  DROP  索引名称;

方式2:

DROP  INDEX  索引名称  ON  表名称;

注意:

  • 当单列索引的字段删除后,索引会自动删除
  • 当联合索引的字段删除一个后,联合索引会自动删除该字段

8、降序索引

  • 索引默认是使用升序的方式存储键值的
  • 在MySQL语法上。从4.0版本开始就已经支持降序索引的语法了,但实际上该DESC定义是被忽略的
  • MySQL8.0版本才开始真正支持降序索引(仅InnoDB支持)

MySQL在8.0之前创建的仍然时升序索引,使用时进行反向扫描,这大大降低了数据库的效率。

在某些场景下,降序索引意义重大。例如:

         如果一个查询,需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将会避免数据库使用额外的文件排序操作,从而提高性能。

案例:

1>在MySQL8中,创建表时,创建联合索引,指定索引中a升序,b降序

CREATE TABLE STUDENT07(
	a INT
	,b INT  
	,INDEX IDX_A_B(a ASC,b DESC)
);

2>使用存储过程插入799条模拟数据

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE STUDENT07_insert() 
BEGIN
	DECLARE i INT DEFAULT 1;
	WHILE i<800
	DO
		insert into STUDENT07 select rand()*80000,rand()*80000; 
		SET i=i+1;
	END WHILE;
	commit; 
END //
DELIMITER ;

-- 调用存储过程
CALL STUDENT07_insert();

3>测试使用降序索引

EXPLAIN SELECT * FROM STUDENT07 ORDER BY a,b DESC LIMIT 5;

结果:证明排序使用了索引,性能好

 4>删除上述联合索引,创建新的联合索引,a升序,b也升序(模拟MySQL8以下的版本)

-- 删除原来的索引
DROP INDEX IDX_A_B ON STUDENT07;

-- 创建新的联合索引,a升序,b也升序(模拟MySQL8以下的版本)
CREATE INDEX IDX_A_B ON STUDENT07(a,b);	--默认就是升序的

5>测试不使用降序索引

EXPLAIN SELECT * FROM STUDENT07 ORDER BY a,b DESC LIMIT 5;

结果: 使用了filesort(文件排序,性能不好)

​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UG\NX二次开发 获取对象的边界包容盒 UF_MODL_ask_bounding_box

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取对象的边界包容盒 UF_MODL_ask_bounding_box,只能得到绝对坐标系下的边界包容盒,速度快,结果不精确。 效果: 代码: //UF_MODL_ask_bounding_box #include "me.hpp" #include &…

发布项目管理生产的时候出现界面滚动不了

新的项目管理发布后出现页面鼠标上下滚动不了的问题&#xff0c;比较奇怪的是&#xff0c;本地开发没有问题&#xff0c;但发布生产后就出现问题了。 因为这次增加的组件比较多&#xff0c;相应的样式也比较多&#xff0c;所以那先分几个部分处理 1、先新加的几个组件是否有冲…

浅谈物联网在电力行业的应用

摘要&#xff1a;随着社会经济的快速发展&#xff0c;物联网技术也在各个行业中得到了广泛的应用&#xff0c;特别是在电力行业中应用物联网技术&#xff0c;也有效的促进了电力行业的现代化发展。而物联网与智能电网同样都是当代重要的高新技术以及新兴产业。所以通过对于物联…

3Ds max入门教程:逼真的细菌

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 最终图像 在本教程中&#xff0c;您将学习如何创建一个异国情调的细菌世界。主要重点将是制造使一切变得不同的材料。 步骤-1 遵循红色、绿色和橙色框参数。 步骤-2 在“渲染场景”&#xff08;F10&…

Web训练项目相关

一、简述 一直没有机会整理前面做过的内容&#xff0c;特此文章整理所学过的web相关训练内容,方便查阅&#xff0c;并在其中参杂对代码理解。 二、相关项目 1.getparameter的url传值 index.jsp <% page language"java" contentType"text/html; charsetu…

概率论的学习和整理16: 泊松分布(未完成)

目录 简单的扩展到泊松分布 比较整体的动态过程&#xff0c;增加实验次数时 当二项分布&#xff0c;n很大&#xff0c;p很小的时候&#xff0c;会趋向泊松分布 当n足够大时&#xff0c;二项分布趋向于正态分布。这个结论在概率论中被称为中心极限定理&#xff0c;它是概率论中一…

【剑指offer】14. 数值的整数次方(java)

文章目录 数值的整数次方描述示例1示例2示例3思路完整代码 数值的整数次方 描述 实现函数 double Power(double base, int exponent)&#xff0c;求base的exponent次方。 注意&#xff1a; 1.保证base和exponent不同时为0。 2.不得使用库函数&#xff0c;同时不需要考虑大…

家政小程序开发-H5+小程序

移动互联网的发展&#xff0c;微信小程序逐渐成为商家拓展线上业务的重要手段。家政服务作为日常生活中不可或缺的一部分&#xff0c;也开始尝试通过小程序来提高服务质量和效率。 下面是一篇关于家政小程序开发的H5小程序的文章&#xff0c;希望对您有所帮助。 家政服…

【大虾送书第二期】《Python机器学习:基于PyTorch和Scikit-Learn 》

目录 ✨写在前面 ✨亲笔作序推荐 ✨内容简介 ✨学完本书&#xff0c;你将能够 ✨作者简介 ✨PyTorch核心维护者亲笔推荐 ✨抢先购买 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 近年来&#xff0c;…

nginx日志分析,实时可视化工具goaccess

一款可以实时分析NGINX访问日志&#xff0c;并且支持可视化的软件 GoAccess - Visual Web Log Analyzer github如下&#xff1a;GitHub - allinurl/goaccess: GoAccess is a real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or th…

精通从入门到工程应用 PLC:

PLC&#xff08;可编程逻辑控制器&#xff09;的学习和入门相对容易&#xff0c;但其难点在于实际的工程应用。学习PLC并熟悉其基本操作并不复杂&#xff0c;但真正掌握其在实际工程中的应用需要更多的经验和实践。 PLC的实际工程应用与具体项目紧密相关&#xff0c;需要了解信…

一套完全开源,支持多租户,界面配置单点的后端框架JVS

JVS的多租户体系统 在IT系统中&#xff0c;“租户”&#xff08;tenant&#xff09;通常用于指代一种多租户架构&#xff08;multi-tenancy&#xff09;&#xff0c;它是一种软件架构模式&#xff0c;允许多个用户或组织共享相同的应用程序或系统实例&#xff0c;但彼此之间的…

【Docker安装部署Hippo4j教程】

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

ElasticSearch文档(document)在index上的增删改查

文章目录 一、document定义&#xff1a;二、单条增删改查1、创建索引&#xff1a;2、添加文档&#xff1a;3、获取文档&#xff1a;4、更新文档&#xff1a;5、删除文档&#xff1a; 三、批量增删改查&#xff1a;1、批量添加文档&#xff1a;2、批量更新文档&#xff1a;3、批…

OpenCV中的RGB与YUV转换

1 基本概念 YUV 颜色空间从模拟电视时代开始就被广泛应用于彩色图像的转换与处理。其基于一个 3x3 的矩阵&#xff0c;通过线性变换将 RGB 像素转换为一个亮度&#xff08;Luma&#xff09;分量 Y 以及两个色度&#xff08;Chroma&#xff09;分量 U 和 V。由于模拟电视存在着多…

【图像分割和识别】活动形状模型 (ASM) 和活动外观模型 (AAM)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL常用命令1

文章目录 SQL分类DDL数据库数据库中的表 DMLDQLDCL函数约束多表查询多表关系多表查询概述内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 事务事务简介事务操作事务隔离级别 SQL分类 DDL 数据库 查询所有数据库 show databases;查询当前…

Android 四大布局使用详解

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、LinearLayout 线性布局二、RelativeLayout 关系布局三、FrameLayout 帧布局四、TableLayout 表格布局 在Android 中&#xff0c;有界面存在的地方就…

Linux 调试进阶(多场景覆盖)

1. 背景 最近在小米项目中分析较多crash问题&#xff0c;结合之前在《程序员的自我修养——链接&#xff0c;状态与库》书中学到的一点皮毛。感触颇深&#xff0c;总结了一些经验&#xff0c;相信对大家分析相关问题有一定的帮助。因为本文的知识点偏于底层&#xff0c;大部分…

前端面试题-js(三)

31 介绍js有哪些内置对象 Object 是 JavaScript 中所有对象的⽗对象数据封装类对象&#xff1a; Object 、 Array 、 Boolean 、 Number 和 String其他对象&#xff1a; Function 、 Arguments 、 Math 、 Date 、 RegExp 、 Error 32 说⼏条写JavaScript的基本规范 不要在同…