【MySQL从入门到精通】【高级篇】(十九)索引的分类&创建索引的三种方式&删除索引的两种方式

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL中的索引包括普通索引、全文索引、单列索引、多列索引和空间索引等。

1. 索引的分类

MySQL中的索引包括普通索引、全文索引、单列索引、多列索引和空间索引等。

功能逻辑上说:索引主要有4种,分别是普通索引、唯一索引、主键索引、全文索引。

按照物理实现方式,索引可以分为2种:聚簇索引和非聚簇索引。

按照作用字段个数进行划分,分成单列索引和联合索引。

1.1. 普通索引

在创建普通索引时,不附加任何限制条件,只是用于提高查询效率,这类索引可以创建在任何数据类型中,其值是否唯一或者非空,要由字段本身的完整性约束条件来决定,建立索引以后,可以通过索引进行查询。例如:在表User的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询。

1.2. 唯一性索引

使用UNIQE参数 可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的。但允许有空值,在一张数据表里可以有多个唯一索引。

1.3. 主键索引

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

1.4. 单列索引

在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引。

1.5. 多列(组合、联合)索引

多列索引是在表的多个字段组合上创建一个索引,该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。例如:在表中的字段id,name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。使用组合索引时遵循最左前缀集合

1.6. 全文索引

全文索引(也称全文检索)是目前搜索引擎 使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。

使用参数FULLTEXT 可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引只能创建在CHARVARCHARTEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。

1.7. 小结

不同的存储引擎支持的索引类型也不一样

InnoDB:支持B+Tree、Full-text等索引,不支持Hash索引;

MyISAM:支持B+Tree、Full-text等索引,不支持Hash索引;

Memory:支持B+Tree、Hash等索引,不支持Full-text等索引;

NDB:支持Hash索引,不支持B+Tree、Full-text等索引;

Archive:不支持B+Tree、Hash、Full-text等索引

2. 创建索引

前面介绍了索引的分类,下面就介绍下创建索引的三种方式。我们可以在创建表的时候就同时给表创建索引,也可以在已存在的表中创建索引。

MySQL支持多种方法在单个或多个列上创建索引;在创建表的定义语句CREATE TABLE 中指定索引列,使用ALTER TABLE 语句在存在的表上创建索引,或者使用CREATE INDEX 语句在已存在的表上添加索引。

2.1. 创建表的时候创建索引

在使用CREATE TABLE 创建表时,除了可以定义列的数据类型外,还可以定义主键约束,外键约束或者唯一性约束,而无论创建哪种约束,在定义约束的同时相当于在指定列上创建了一个索引。

举例:

CREATE TABLE dept(
  dept_id INT PRIMARY KEY AUTO_INCREMENT,
  dept_name VARCHAR(20)
);
CREATE TABLE emp(
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
  emp_name VARCHAR(30) UNIQUE,
    dept_id INT,
  CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id));

在创建dept表时指定dept_id列为主键索引(聚集索引),在创建 emp表时指定emp_name列唯一的约束,并且设置了该表中dept_id列为外键

2.1.1 通过命令查看索引

-- 通过命令查看索引
#方式1
SHOW CREATE TABLE emp;
#方式2
SHOW INDEX FROM emp;

可以emp表中有三个索引,分别是主键索引PRIMARY,唯一索引 emp_name(未指定索引名的话则直接使用列名作为索引),外键索引 emp_dept_id_fk。

如果显式创建表时创建索引的话,基本语法格式如下:

CREATE TABLE table_name [col_name data_type] 
[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](col_name[legth]) [ASC|DESC]

UNIQUE、FULLTEXT和SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引。

INDEX与KEY为同义词,两者的作用相同,用来指定创建索引;

index_name 指定索引的名称,为可选参数,如果不指定,则MySQL默认col_name为索引名。

col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;

length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;

ASC 或 DESC 指定升序或者降序的索引值存储。

举例说明:

CREATE TABLE book(
  book_id INT PRIMARY KEY AUTO_INCREMENT,
  book_name VARCHAR(20),
  `authors` VARCHAR(20),
  UNIQUE INDEX uk_book_name(book_name)
);
SHOW INDEX FROM book;

在book表的book_name列上增加唯一索引uk_book_name。

插入数据测试一下:

创建了一个给title和body字段添加全文索引的表。

CREATE TABLE `papers`(
  id INT(10) PRIMARY AUTO_INCREMENT,
  title VARCHAR(200) DEFAULT NULL,
  content text,
  FULLTEXT KEY `title`(`title`,content)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

不同于like方式的查询:

SELECT * FROM papers WHERE content LIKE '%查询字符串%';

全文索引用match+against方式查询:

SELECT * FROM papers WHERE MATCH(title,content) AGAINST('查询字符串');

明显提高查询效率,不过需要注意的是:

使用全文索引前,搞清楚版本支持情况;

全文索引比like+% 块N倍,但是可能存在精度问题;

如果需要全文索引的是大量数据,建议先添加数据,在创建索引。

2.2. 在已存在的表上创建索引

在已经存在的表中创建索引可以使用ALTER TABLE 语句或者CREATE INDEX 语句。

2.2.1. 使用ALTER TABLE语句创建索引

ALTER TABLE语句创建索引的基本语法如下:

ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](col_name[legth]) [ASC|DESC]

与创建表时创建索引的语法不同的是:在这里使用了ALTER TABLE和ADD 关键字,ADD表示向表中添加索引。

举例1:在book2表中的authors字段上建立名为idx_authors的普通索引,在book_id列和book_name列上创建多列索引mul_bid_bname。

ALTER TABLE book2 ADD INDEX idx_authors(authors);
ALTER TABLE book2 ADD INDEX mul_bid_bname(book_id,book_name);

这里需要注意的是在多列索引中满足最左匹配原则,也就是查询条件是多列索引中的第一列时才会使用到索引。

2.2.2. 使用CREATE INDEX语句创建索引

CREATE INDEX语句创建索引的基本语法如下:

CREATE  [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name]  ON table_name(col_name[legth])

举例2: 在book3表中的book_name列创建唯一索引uk_idx_bname。

CREATE TABLE book3(
  book_id INT PRIMARY KEY AUTO_INCREMENT,
  book_name VARCHAR(20),
  `authors` VARCHAR(20)
);
INSERT INTO book3(book_name,authors) 
VALUES('Python从入门到精通','码农飞哥');
INSERT INTO book3(book_name,authors) 
VALUES('MySQL从入门到精通','码农飞哥2号');
INSERT INTO book3(book_name,authors) 
VALUES('JAVA从入门到精通','码农飞哥3号');
CREATE UNIQUE INDEX uk_idx_bname ON book3(book_name);

3. 删除索引

前面介绍了创建索引,那么如何删除索引呢?tips: 当进行数据大批量插入时,可以先删除索引,然后,等数据插入好之后在创建索引。

删除索引有两种方式,其基本语法如下:

3.1. 方式一

ALTER TABLE table_name DROP INDEX [index_name]

3.2. 方式二

DROP INDEX [index_name] ON table_name

举个例子:用这两种方式分别删除book3表中的uk_idx_bname索引和uk_idx_authors索引

-- 方式一
ALTER TABLE book3 DROP INDEX uk_idx_bname;
-- 方式二
DROP INDEX uk_idx_authors ON book3;

总结

本文详细介绍了索引的分类以及创建索引的三种方式,索引按照物理实现可以分为聚簇索引和非聚簇索引,按照功能分类可以分为主键索引,普通索引,唯一索引、全文索引。而创建索引的方式有三种:分别是创建表时指定索引,就是在 CREATE TABLE 语句中创建索引,第二种是通过 ALTER TABLE table_name ADD ... 语句来创建,当然也可以通过第三种方式 CREATE INDEX ... ON ... 语句来实现。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
12 0
|
22天前
|
存储 监控 关系型数据库
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
|
22天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
105 0
|
22天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
22天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:揭秘MySQL游标,数据处理的神秘利器(16)
轻松入门MySQL:揭秘MySQL游标,数据处理的神秘利器(16)
|
22天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
22天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
22天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
轻松入门MySQL:优化进销存管理,掌握MySQL索引,提升系统效率(11)
|
22天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
22天前
|
SQL 存储 关系型数据库
轻松入门MySQL:玩转数据表的增、删、改、查(4)
轻松入门MySQL:玩转数据表的增、删、改、查(4)