如何理解MySQL的索引?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


一、什么是索引

索引的定义为:索引(index)是帮助MySQL高效获取数据的​​数据结构​​(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

将数据进行排序整理的过程就称为索引

我们根据索引去查,提高效率

如何理解MySQL的索引?_数据库

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

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

如何理解MySQL的索引?_表名_02

二、MySQL索引分类

markdown * 主键(约束)索引 主键约束+提高查询效率

  • 唯一(约束)索引 唯一约束+提高查询效率
  • 普通索引 仅提高查询效率
  • 组合(联合)索引 多个字段组成索引 name age
  • hash索引 根据key-value 效率非常高
  • 全文索引 通过查找文本中的关键词,类似于搜索引擎

说明:我们创建表时就会指定逐渐和唯一约束,那么就相当于给表的字段添加了主键和唯一索引。

三、MySQL索引语法

3.1 创建索引

① 在已有表的字段上直接创建【了解】

-- 创建普通索引
create index 索引名 on 表名(字段);

-- 创建唯一索引
create unique index 索引名 on 表名(字段);

-- 创建普通组合索引
create index 索引名 on 表名(字段1,字段2,..);

-- 创建唯一组合索引
create unique index 索引名 on 表名(字段1,字段2,..);

说明:

  1. 如果在同一张表中创建多个索引,要保证索引名是不能重复的。
  2. 上述创建索引的方式比较麻烦,还需要指定索引名。
  3. 采用上述方式不能添加主键索引。

【准备创建表的SQL语句】

create database day04;

use day04;
-- 创建学生表
CREATE TABLE student(
id INT,
name VARCHAR(32),
telephone VARCHAR(11)
);

【给上述表的字段设置索引】

1.给name字段设置普通索引

CREATE INDEX name_idx ON student(name);

2.给telephone字段设置唯一索引

CREATE UNIQUE INDEX telephone_uni_idx ON student(telephone);

设置好之后可以通过图形化工具查看设置的索引:

如何理解MySQL的索引?_数据库_03

如何理解MySQL的索引?_表名_04

② 在已有表的字段上修改表时指定【了解】

-- 添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
alter table 表名 add primary key(字段); --默认索引名:primary

-- 添加唯一索引(除了NULL外,NULL可能会出现多次)
alter table 表名 add unique(字段); -- 默认索引名:字段名

-- 添加普通索引,索引值可以出现多次。
alter table 表名 add index(字段); -- 默认索引名:字段名

【准备的创建表的SQL语句】

-- 创建学生表
CREATE TABLE student2(
id INT,
name VARCHAR(32),
telephone VARCHAR(11)
);

【给上述表的字段设置索引】

1.指定id为主键索引

ALTER TABLE student2 ADD PRIMARY KEY(id);

2.指定name为普通索引

ALTER TABLE student2 ADD INDEX(name);

3. 指定telephone为唯一索引

ALTER TABLE student2 ADD UNIQUE(telephone);

设置好之后可以通过图形化工具查看设置的索引:

如何理解MySQL的索引?_mysql_05

③ 创建表时指定【掌握】

-- 创建学生表
CREATE TABLE student3(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键索引
name VARCHAR(32),
telephone VARCHAR(11) UNIQUE, -- 唯一索引
sex VARCHAR(5),
birthday DATE,
INDEX(name) -- 普通索引
);

如何理解MySQL的索引?_表名_06

3.2 查看索引

show index from 表名;

【查看student3表的索引信息】

show index from student3;

结果:

如何理解MySQL的索引?_数据_07

3.3 删除索引

  • 语法

【语法1】直接删除

-- 直接删除
drop index 索引名 on 表名;

【语法2】修改表时删除

-- 修改表时删除
alter table 表名 drop index 索引名;
  • 练习

(1)删除student表的name普通索引

DROP INDEX name_idx ON student;

(2)删除student表的telephone唯一索引

ALTER TABLE student DROP INDEX telephone_uni_idx;

四、千万表记录索引效果演示

使用之前创建好的user数据表中的千万条数据进行测试。注意user表中是没有索引的。

如何理解MySQL的索引?_数据_08

【1.先来测试没有索引情况下查询】

-- 1.指定id查询
select * from user where id = 8888888;
-- 2.指定username精准查询
select * from user where username = 'jack1234567';

如何理解MySQL的索引?_数据库_09

【2.给这2个字段添加索引】

说明:给表的字段添加索引时,底层通过排序方式进行关联组合。所以需要消耗一些时间,并且索引也会占硬盘空间。所以大家使用索引时还需要慎重。

没有添加索引之前,数据占硬盘空间大小:

如何理解MySQL的索引?_字段_10

按照如下方式给以下字段添加索引:

-- 指定id为主键索引
ALTER TABLE USER ADD PRIMARY KEY(id);
-- 指定username为普通索引
ALTER TABLE USER ADD INDEX(username);

如何理解MySQL的索引?_mysql_11

添加索引之后,数据占硬盘空间大小:

如何理解MySQL的索引?_表名_12

如果在多添加索引,那么占硬盘空间大小还会增加。如果表很复杂,索引加多的话,有可能比原来多几个G也是有可能的。

【3.再测试有索引情况下查询】

-- 1.指定id查询
select * from user where id = 8888888;
-- 2.指定username精准查询
select * from user where username = 'jack1234567';

如何理解MySQL的索引?_表名_13

说明:通过以上结果可以看出有了索引之后,查询速度比之前快了几十倍。快的飞起。

五、索引的优缺点

优势

1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。

2) 索引底层就是排序,通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。

劣势

- 在数据库建立过程中,需花费较多的时间去建立并维护索引,特别是随着数据总量的增加,所花费的时间将不断递增。

- 在数据库中创建的索引需要占用一定的物理存储空间,这其中就包括数据表所占的数据空间以及所创建的每一个索引所占用的物理空间。

- 在对表中的数据进行修改时,例如对其进行增加、删除或者是修改操作时,索引还需要进行动态的维护,这给数据库的维护速度带来了一定的麻烦。

六、后续学习

有关索引后续呢,还有数据结构的学习>聚簇索引和非聚簇索引>hash索引>覆盖索引>索引的创建原则>避免索引失效>批量数据分页查询的优化方案等等内容。

还有一些高频面试题
【1】Hash索引和B+树所有有什么区别或者说优劣呢?
【2】在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢(索引失效)?
【3】你知道mysql有哪些索引?
【4】创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
【5】联合索引是什么?为什么需要注意联合索引中的顺序?
【6】非聚簇索引一定会回表查询吗?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql