前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL索引的建立方式

MySQL索引的建立方式

原创
作者头像
用户4988376
修改于 2021-08-13 02:45:22
修改于 2021-08-13 02:45:22
2.4K00
代码可运行
举报
文章被收录于专栏:IT资讯新闻IT资讯新闻
运行总次数:0
代码可运行

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。


普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE INDEX indexName ON table_name (column_name)

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
INDEX [indexName] (username(length))  
 
);  

删除索引的语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP INDEX [indexName] ON mytable; 

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE UNIQUE INDEX indexName ON mytable(username(length)) 

修改表结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER table mytable ADD UNIQUE [indexName] (username(length))

创建表的时候直接指定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
UNIQUE [indexName] (username(length))  
 
);  

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> ALTER TABLE testalter_tbl DROP INDEX c;

使用 ALTER 命令添加和删除主键

主键作用于列上(可以一个列或多个列联合主键),添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令删除主键:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。


显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

尝试以下实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> SHOW INDEX FROM table_name\G
........

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
错误: 类Something是公共的, 应在名为 Something.java 的文件中声明
错误: 类Something是公共的, 应在名为 Something.java 的文件中声明
黑泽君
2018/10/11
8.7K0
java文件中public 类名要和文件名保持一致
一个Java文件可以有多个类作为内部类/Adapter类/其它类,但是只能有一个public类,且类名必须和文件名一致。这是这类语言的一个不好的地方。 在现实情况中,经常有一些很小的类由几个类共同需要,因此无法作为内部类,而且接口关系必须设置为public,这样就导致了大量很小的.Java程序,每个都只有几百字节。 这类语言的另一个问题是一个类的所有实现的方法都必须包含在同一个文件中。在swing应用程序中,经常导致长达一两百K字节的源程序,行数达到三四千行,搞得JBuilder奇慢无比。 一个 .java 文件,可以有多个类,但是文件名只能有一个,用哪一个类名来充当文件名呢?其实文件名是无所谓的,因为将来用 javac 进行编译的时候,最终会生成多个 .class 文件,每一个类对应个 .class 文件。运行时只要运行对应的 .class 文件就可以了,这时 .java 文件就显得没什么用了( 运行时不需要 ),那还管它叫什么名字。 但是当你的类被 public 修饰时,此时文件名必须和该类保持一致(例如 public class A{} 只能放在 A.java 文件中,不然在用 javac 编译时会提示错误:类 A 是公共的,应在名为 A.java 的文件中声明)。也就是说在同一个 .java 文件中,不应该出现2个或2个以上的 public class 。 如果有一个public class类,就应该让文件名和此类名相同;那如果没有呢,即所有的 class 都没有修饰符,那么可以给该文件随便起名字,甚至可以不和任意一个类同名,哪怕是汉字名称都可以,但是后缀还是要有.java 的 。 注:有很多初学者 ( 我也是 ) 可能会认为文件名应该也和 main 方法所在类有关系,其实不然。main 方法只是程序的一个入口,老师讲“一个程序只能有一个入口”,好象是在说只能有一个 main 方法,其实,只要你高兴,就可以在所有类里都写上 main 方法,给程序提供N多个入口,但是最后你运行程序的时候也只能从其中的一个入口进去,这就是 main 的作用( 程序入口 )。(这也就是为什么你会发现,程序员在做单元测试时,会往自己做的很多类里面添加 main 方法,因为他要为自己做的东西添加运行入口,从而能方便测试。)
知识浅谈
2020/09/07
1.5K0
Java main()方法剖析
此处,Something类的文件名叫OtherThing.java,该程序是否可以正常编译、运行?
CODER-V
2023/03/04
6870
【Java】快速入门
https://www.liaoxuefeng.com/wiki/1252599548343744/1255878730977024
20岁爱吃必胜客
2022/11/13
3820
04.Java对象和类
04.Java对象和类 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念。 对象:对象是类的一个
Java帮帮
2018/03/15
9600
04.Java对象和类
工程师笔试题2(答案解析)
一、单项选择题 1.二进制数 11101 转化为十进制数是( )。 A.23 B.17 C.26 D.29 2.以下可以对对象加互斥锁的关键字是( )。 A.synchronized B.serialize C.volatile D.static 二、不定项选择题 3.下列关于类的构造方法的描述中,正确的是( )。 A.类中的构造方法不可省略 B.构造方法必须与类同名,但方法不能与class 同名 C.构造方法在一个对象被 new 时执行 D.一个类只能定义一个构造方法 4.下列关于 Java 语
Java学习
2018/04/18
7490
包, 公共类与Java源码文件介绍
Java中的一个包就是一个类库单元,包内包含有一组类,它们在单一的名称空间之下被组织在了一起。这个名称空间就是包名。可以使用import关键字来导入一个包。例如使用import java.util.*就可以导入名称空间java.util包里面的所有类。所谓导入这个包里面的所有类,就是在import声明这个包名以后,在接下来的程序中可以直接使用该包中的类。例如:
用户7886150
2020/12/02
6400
夯实Java基础系列5:Java文件和Java包结构
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/27
6770
【趣学程序】第一个java程序
一台配置了java环境变量的电脑 安装notepad++高级记事本软件(notepad++软件下载地址:https://share.weiyun.com/5Wux6dA)
趣学程序-shaofeer
2019/07/27
1.1K0
Java之 public class 和 class 的区别
文章目录 1. public class 和 class 的区别 2. 总结: 1. public class 和 class 的区别 一个java源文件当中可以定义多个class 一个java源文件当中public的class不是必须的 一个class会定义生成一个xxx.class字节码文件 一个java源文件当中定义公开的类的话,只能有一个,并且该类名称必须和java源文件名称一致 每一个class当中都可以编写main方法,都可以设定程序的入口,向执行B.class中的main方法: java B,
兮动人
2021/06/11
1.7K0
Java之 public class 和 class 的区别
一文读懂 Java 文件和包结构,解读开发中常用的 jar 包
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/09/29
7.4K0
一文读懂 Java 文件和包结构,解读开发中常用的 jar 包
关于JAVA你必须知道的那些事(一):概述
第一次写文章,有点小紧张,不过没关系,因为我面对的都是小白。好了废话少说,直接开始吧。
啃饼思录
2018/12/06
7870
JAVA中类的public class与class的区别详解
参考:http://www.jb51.net/article/39892.htm http://www.cnblogs.com/stevengerrard/p/4067422.html 《java编程思想》
全栈程序员站长
2022/06/28
1.1K0
JAVA中类的public class与class的区别详解
Java基础7:关于Java类和包的那些事
https://h2pl.github.io/2018/04/24/javase7
程序员黄小斜
2019/04/06
9400
几点Java程序必须满足的基本规则
Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
博文视点Broadview
2020/06/11
7090
几点Java程序必须满足的基本规则
Java程序设计(基础)- 概述
java编译器为每个类生成一个字节码文件,且文件名与类名相同,这就会带来一个问题:同名的类会发生冲突。
全栈程序员站长
2022/06/30
3830
Java程序设计(基础)- 概述
【计算机本科补全计划】Java学习笔记(二) 基础语法红黄蓝
正文之前 刚才突然想起来自己CCF报名还没报名成功,就是一阵心绞痛,明晚就截止了,要是没报上,到时候怎么跟老师交差,突然想起来,如果老师问我最近干了啥,可以用准备考试搪塞过去么。虽然我也是在学习,但是
用户1687088
2018/05/07
9230
【计算机本科补全计划】Java学习笔记(二) 基础语法红黄蓝
第一个Java程序—HelloWorld[通俗易懂]
工欲善其事必先利其器,在写第一个Java程序之前,需要安装JDK以及配置环境变量,具体步骤见 Windows中配置Java环境变量。
全栈程序员站长
2022/09/08
1.2K0
第一个Java程序—HelloWorld[通俗易懂]
Java编程思想第五版(OnJava8)第七章 - 封装
所有优秀的作者——包括那些编写软件的人——都知道一件好的作品都是经过反复打磨才变得优秀的。如果你把一段代码置于某个位置一段时间,过一会重新来看,你可能发现更好的实现方式。这是重构(refactoring)的原动力之一,重构就是重写可工作的代码,使之更加可读,易懂,因而更易维护。
JavaEdge
2020/05/27
8890
Java | 顶层类(Top-Level Class)
顶层类(Top-Level Class),是 Java 中对类的一种定义方式。在 .java 文件中,处于最外层的类就称为顶层类,在其外部不存在将其包围起来的任何代码块。下面的示例就是一个典型的顶层类:
Blume
2020/06/26
1.3K0
Java | 顶层类(Top-Level Class)
推荐阅读
相关推荐
错误: 类Something是公共的, 应在名为 Something.java 的文件中声明
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 普通索引
    • 创建索引
    • 修改表结构(添加索引)
    • 创建表的时候直接指定
    • 删除索引的语法
  • 唯一索引
    • 创建索引
    • 修改表结构
    • 创建表的时候直接指定
  • 使用ALTER 命令添加和删除索引
  • 使用 ALTER 命令添加和删除主键
  • 显示索引信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档