【1】索引

索引,通俗理解,即目录。

之前说过,计算机是对现实世界的模拟。目录应用在数据库领域,即所谓的索引。

目录的作用显而易见,所以建立索引可以大大提高检索的速度。

但是,会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。

因更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

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

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

【2】索引分类

Mysql的索引分为普通索引、唯一索引、主键、全文索引。

有的地方分为单列索引(普通索引、唯一索引、主键索引)和组合索引、全文索引。个人认为太学术性。

(2.1)主键(PRIMARY KEY)

场景1:使用AUTO_INCREMENT

# 场景1:
# 创建表SQL特点
# 1.sId列被AUTO_INCREMENT修饰
# 2.没有任何索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

SQL执行失败。

提示ERROR:

Incorrect table definition; there can be only one auto column and it must be defined as a key

分析原因:没有为sId列创建索引,即key

场景2:创建表同时创建主键

# 场景2:
# 创建表SQL特点
# 1.sId列被AUTO_INCREMENT修饰
# 2.创建主键
# 3.主键列为sId
DROP TABLE IF EXISTS students2;
CREATE TABLE `students2` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`sId`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb

SQL执行成功。

查询主键:

# 查询表索引
SHOW INDEX FROM students2;

结果:

说明:场景2为创建主键的方式之一。

场景3:创建表不添加任何索引

# 场景3:
# 创建表SQL特点
# 1.sId列没有被AUTO_INCREMENT修饰
# 2.没有任何索引
DROP TABLE IF EXISTS students3;
CREATE TABLE `students3` (
`sId` INT(20) UNSIGNED NOT NULL,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

执行成功。

创建主键(单列):

# 创建主键(单列)
ALTER TABLE students3 ADD PRIMARY KEY (sId);

查询主键:

# 查询主键
SHOW INDEX FROM students3;

查询结果:

删除主键:

# 删除主键
ALTER TABLE students3 DROP PRIMARY KEY;

创建主键(多列):

# 创建主键(多列)
ALTER TABLE students3 ADD PRIMARY KEY (sId, sName);

查询主键:

# 查询主键
SHOW INDEX FROM students3;

查询结果:

删除主键,方法同上。

若不删除这个多列主键,试图再添加一个主键:

# 创建第二个主键索引
ALTER TABLE students3 ADD PRIMARY KEY (sId, sStuId);

执行报错:

查询:ALTER TABLE students3 ADD PRIMARY KEY (sId, sStuId) 错误代码: 1068
Multiple PRIMARY KEY defined

多个主键定义错误!

分析以上三种场景,对主键总结:

(a)主键列的值必须是唯一的

(b)主键列的值不允许为空

(c)主键保证记录的唯一性

(d)主键可以由多列组成

(e)每张表只允许存在一个主键

(2.2)唯一索引

场景1:创建表时创建唯一索引

# 场景1:建表时创建唯一性索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`sId`),
UNIQUE INDEX `idx_name` (`sName`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查询表索引
SHOW INDEX FROM students1;

查询唯一索引结果:

提示:此为创建唯一索引方式之一

场景2:创建表时未创建唯一索引

如果创建表时,忘记创建唯一索引,那么可以通过两种方式添加:

创建唯一索引方式二:

# 创建唯一索引(单列)
CREATE UNIQUE INDEX uidx_name ON students2 (sName);
# 查询唯一索引(单列)
SHOW INDEX FROM students2;
# 删除唯一索引(单列)
DROP INDEX uidx_name ON students2;
# 查询唯一索引(单列)
SHOW INDEX FROM students2;

查询唯一索引结果:

创建唯一索引方式三:

# 创建唯一索引(单列)
ALTER TABLE students2 ADD UNIQUE INDEX uidx_name (sName);
# 查询唯一索引(单列)
SHOW INDEX FROM students2;
# 删除唯一索引(单列)
ALTER TABLE students2 DROP INDEX uidx_name;
# 查询唯一索引(单列)
SHOW INDEX FROM students2;

查询唯一索引结果:

创建多列唯一索引:

# 创建唯一索引(多列)
ALTER TABLE students2 ADD UNIQUE INDEX uidx_addr_age (sAddr, sAge);
# 查询唯一索引(多列)
SHOW INDEX FROM students2;
# 删除唯一索引(多列)
ALTER TABLE students2 DROP INDEX uidx_addr_age;
# 查询唯一索引(多列)
SHOW INDEX FROM students2;

查询多列唯一索引结果:

创建多个唯一索引:

# 创建唯一索引(单列)
CREATE UNIQUE INDEX uidx_name ON students2 (sName);
# 创建唯一索引(多列)
ALTER TABLE students2 ADD UNIQUE INDEX uidx_addr_age (sAddr, sAge);
# 查询唯一索引
SHOW INDEX FROM students2;
# 删除索引uidx_name
DROP INDEX uidx_name ON students2;
# 删除索引uidx_addr_age
DROP INDEX uidx_addr_age ON students2;

查询唯一索引结果(uidx_name 和 uidx_addr_age两个唯一索引):

分析以上两种场景,对唯一索引总结:

(a)唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。

(b)索引列的值必须唯一,但允许有NULL。如果唯一索引是组合列索引,则组合列的值必须唯一。

(c)每张表可以创建多个唯一索引。

(2.3)普通索引

场景1:创建表时创建普通索引

# 场景1:创建表时创建普通索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`sId`),
INDEX `idx_name` (`sName`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查询普通索引
SHOW INDEX FROM students1;

查询创建索引:

场景2:创建表时未创建普通索引

# 场景2:创建表时未创建普通索引
DROP TABLE IF EXISTS students2;
CREATE TABLE `students2` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`sId`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

若创建表时未创建普通索引,可以通过以下两种方式创建普通索引:

创建普通索引方式二:

# 创建普通索引(单列)
CREATE INDEX idx_name ON students2 (sName);
# 查询普通索引(单列)
SHOW INDEX FROM students2;
# 删除普通索引(单列)
DROP INDEX idx_name ON students2;
# 查询普通索引(单列)
SHOW INDEX FROM students2;

查询创建索引:

创建普通索引方式三:

# 创建普通索引(单列)
ALTER TABLE students2 ADD INDEX idx_addr (sAddr);
# 查询普通索引(单列)
SHOW INDEX FROM students2;
# 删除普通索引(单列)
ALTER TABLE students2 DROP INDEX idx_addr;
# 查询普通索引(单列)
SHOW INDEX FROM students2;

查询创建索引:

创建普通多列索引:

# 创建普通索引(多列)
ALTER TABLE students2 ADD INDEX idx_addr_age (sAddr, sAge);
# 查询普通索引(多列)
SHOW INDEX FROM students2;
# 删除普通索引(多列)
ALTER TABLE students2 DROP INDEX idx_addr_age;
# 查询普通索引(多列)
SHOW INDEX FROM students2;

查询创建索引:

创建多个普通索引:

# 创建多个普通索引
# 创建普通索引(单列)
CREATE INDEX idx_name ON students2 (sName);
# 创建普通索引(多列)
ALTER TABLE students2 ADD INDEX idx_addr_age (sAddr, sAge);
# 查询普通索引
SHOW INDEX FROM students2;
# 删除索引idx_name
DROP INDEX idx_name ON students2;
# 删除索引idx_addr_age
DROP INDEX idx_addr_age ON students2;
# 查询普通索引
SHOW INDEX FROM students2;

查询创建索引:

分析以上两种场景,对普通索引(最基本的索引,没有任何限制)总结:

(a)索引列的值可以为NULL,可以重复。

(b)每张表可以创建多个普通索引。

(c)普通索引同样也可以创建多列。

(2.4)全文索引

场景1:创建表时创建全文索引

# 场景1:创建表时创建全文索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`sId`),
FULLTEXT ft_name_stuid (sName, sStuId)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查询表索引
SHOW INDEX FROM students1;

查询索引结果:

场景2:创建表时未创建全文索引

# 场景2:创建表时未创建全文索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
`sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sName` VARCHAR(100) NOT NULL,
`sAge` INT(10) NOT NULL,
`sAddr` VARCHAR(200) DEFAULT NULL,
`sGrade` INT(10) DEFAULT NULL,
`sStuId` VARCHAR(20) DEFAULT NULL,
`sSex` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`sId`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; # 查询表索引
SHOW INDEX FROM students1;

若创建表时未创建索引,可以通过以下两种方式创建:

创建全文索引方式二:

# 创建全文索引方式二:
# 创建全文索引(多列)
CREATE FULLTEXT INDEX ft_name_addr ON students2 (sName, sAddr);
# 查询全文索引(多列)
SHOW INDEX FROM students2;
# 删除全文索引(多列)
DROP INDEX ft_name_addr ON students2;
# 查询全文索引(多列)
SHOW INDEX FROM students2;

查询全文索引:

创建全文索引方式三:

# 创建全文索引方式三:
# 创建全文索引(多列)
ALTER TABLE students2 ADD FULLTEXT INDEX ft_name_stuid (sName, sStuId);
# 查询全文索引(多列)
SHOW INDEX FROM students2;
# 删除全文索引(多列)
ALTER TABLE students2 DROP INDEX ft_name_stuid;
# 查询全文索引(多列)
SHOW INDEX FROM students2;

查询全文索引:

创建多个全文索引:

# 创建多个全文索引
# 创建全文索引(单列)
CREATE FULLTEXT INDEX ft_name_stuid ON students2 (sName, sStuId);
# 创建全文索引(多列)
ALTER TABLE students2 ADD FULLTEXT INDEX ft_addr (sAddr);
# 查询全文索引
SHOW INDEX FROM students2;
# 删除索引ft_name_stuid
DROP INDEX ft_name_stuid ON students2;
# 删除索引ft_addr
DROP INDEX ft_addr ON students2;
# 查询索引
SHOW INDEX FROM students2;

查询全文索引:

添加整型字段的全文索引:

ALTER TABLE students2 ADD FULLTEXT INDEX ft_age (sAge);

执行失败:

查询:ALTER TABLE students2 ADD FULLTEXT INDEX ft_age (sAge)错误代码: 1283

COLUMN 'sAge' cannot be part of FULLTEXT INDEX

说明:全文索引只可针对字符串类型的字段。

分析以上两种场景,对全文索引总结:

(a)全文索引只针对字段类型为字符串的列。

(b)全文索引可以为多列创建。

【3】总结

(3.1)增加索引:

// 普通索引
alter table table_name add index index_name (column_list);
// 唯一索引
alter table table_name add unique index uindex_name (column_list);
// 主键索引
alter table table_name add primary key (column_list);
// 全文索引
alter table table_name add fulltext index ftindex_name (column_list); // 普通索引
create index index_name on table_name (column_list);
// 唯一索引
create unique index index_name on table_name (column_list);
// 全文索引
create fulltext index ftindex_name on table_name (column_list);

(3.2)删除索引:

// 非主键索引
drop index index_name on table_name;
alter table table_name drop index index_name;
// 删除主键
alter table table_name drop primary key;

Good Good Study, Day Day Up.

顺序 选择  循环 总结

Mysql 索引增加与删除的更多相关文章

  1. Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置

    一.MySQL索引创建与删除 目标: 本案例要求熟悉MySQL索引的类型及操作方法,主要练习以下任务: 普通索引.唯一索引.主键索引的创建/删除 自增主键索引的创建/删除 建立员工表yg.工资表gz, ...

  2. mysql索引创建&查看&删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  3. Mysql索引创建及删除

    1.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...

  4. MySQL索引建立与删除

    #添加索引alter table 表名 add index 索引名称(列名1, 列名2);alter table 表名 add index 索引名称(列名1, 列名2, 列名3);alter tabl ...

  5. MySQL索引创建、删除、查看

    主键索引   PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引.这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引. ALTER TABLE ...

  6. MYSQL索引类型。MYSQLc储存引擎

                                                            MYSQL索引类型,MYSQLc储存引擎 MySQL索引创建与删除 MySQL存储引擎的 ...

  7. MySQL索引的创建、删除和查看

    MySQL索引的创建.删除和查看 此文转自http://blogold.chinaunix.net/u3/93470/showart_2001536.html 1.索引作用 在索引列上,除了上面提到的 ...

  8. MySQL索引的创建,查看,删除

    在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引. 1.ALTER TABLE ALTER TABLE用来创建普通索引.UN ...

  9. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

随机推荐

  1. linux内核情景分析之强制性调度

    从系统调用返回到用户空间是否调度,从ret_with_reschedule可看出,是否真正调度,取决于当前进程的pcb中的need_resched是否设置为1,那如何设置为1取决于以下几种情况: 时间 ...

  2. FTP上传文件服务器python实现

    总结 使用Python的socket和socketserver模块实现ftp文件服务器.不是很难,但在粘包的问题上纠缠了不少时间.解决办法是发送文件信息之后等待一段时间. #!/usr/bin/pyt ...

  3. C#byte怎么转成图片

    这个其实很简单我给大家提供一个方法吧 /// <summary> /// 字节数组生成图片 /// </summary> /// <param name="By ...

  4. asp.net core 2.1 将控制器抽离到类库中

    startup.cs的ConfigureServices中添加: public void ConfigureServices(IServiceCollection services) { var ma ...

  5. Codeforces 791D Bear and Tree Jump(树形DP)

    题目链接 Bear and Tree Jumps 考虑树形DP.$c(i, j)$表示$i$最少加上多少后能被$j$整除. 在这里我们要算出所有$c(i, k)$的和. 其中$i$代表每个点对的距离, ...

  6. springboot集成PageHelper,支持springboot2.0以上版本

    第一步:pom文件还是需要引入依赖 <!--mybatis的分页插件--> <dependency> <groupId>com.github.pagehelper& ...

  7. 无法获得VMCI 驱动程序的版本: 句柄无效。

    写在前面 最近在电脑上安装了VMware虚拟机,在安装系统的使用,总提示错误“无法获得VMCI 驱动程序的版本: 句柄无效.”.最近刚买的电脑,也不会是系统的问题吧,为了装个虚机,总不能重装系统吧,没 ...

  8. quick-coco2d下的事件

    qucik下的事件机制很简洁,也很简单,能够处理大多数的自定义时间,我们新建一个类型,然后用扩展的方式实现事件,之前quick的文档上很详细,但是很悲哀,傻逼的的网站现在是404,记下来,怕到时候忘记 ...

  9. centos使用yum安装gcc

    yum -y install gccyum -y install gcc-c++yum install make -- 或者yum groupinstall "Development Too ...

  10. MongoDB下载安装測试及使用

    1.下载安装 64位:mongodb-win32-x86_64-enterprise-windows-64-2.6.4-signed.msi 余数为1的 db.collection.find({ &q ...