MySQL之索引(一)

84 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,[点击查看活动详情]

1.索引的概述

1.什么是索引?

官方给的解释:索引(Index)是帮助MySQL高效获取数据的数据结构。

索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。 这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找算法 。

转换成人话简单点说就是:索引是一种帮助提升查询速度的数据结构。

2.索引的分类

按照逻辑分类

    1.普通索引:没有任何限制,就是为了加快访问速度。
    2.唯一索引:唯一索引顾名思义,数据在表里只能有一条,不能重复,可以有一个为null,保证数据的唯一性。
    3.主键索引:数据不能为空且唯一,可以理解为不为空的唯一索引,保证数据的唯一性和完整性。
    4.空间索引:空间索引是对空间数据类型的字段建立的索引,空间索引主要用于地理空间数据类型 ,在工作中很少用到
    5.全文索引:主要用来查找文本类型比如,varchar,text等,全文索引允许在索引列中插入重复值和空值,
      MySQL在5.7前只有MyISAM引擎有,在5.7后InnoDB也有了。

按照实际使用分类

     1.单列索引:只使用一个字段建立的索引叫单列索引。
     
     2.多列索引(联合索引):使用多个字段联合建立的索引叫多列索引。

补充

    索引也分为聚簇索引和非聚簇索引(辅助索引),只有主键索引是聚簇索引,非主键索引都是非聚簇索引,
    聚簇索引有一个特点就是主键索引和数据在一起(通俗点讲就是一条条的记录),而非聚簇索引只保留了主
    键索引和索引字段,所以非聚簇索引有时候会出现回表的操作。

3.索引的优点

1.可以提升查询的速度,减少读取磁盘的次数,降低io成本。

2.创建唯一索引可以保证数据的唯一性,创建非空索引可以保证数据的完整性。

3.对于多表查询、order by、group by,降低占用CPU的资源和内存使用,因为有了索引,索引数据是排好序了的,对于磁盘数据文件的读取是顺序读取,而不是随机的。

4.索引的缺点

1.创建索引会占用更多的磁盘空间,会有后缀.ibd的索引数据文件。

2.创建索引提示了查询速度,但是在执行delete、update、insert或者修改表结构时都需要维护索引,导致执行速度降低。

5.索引的使用

新建表test_index

create table `test_index` (
`id` int(11) not null auto_increment comment '主键id',
`name` varchar(50) comment '姓名',
`unique_num` int(11) comment '唯一码',
`create_date` date comment '创建时间',
`desc` text comment '详细描述',
primary key (`id`)
);
1.新建索引

主键索引不能创建,默认会给主键加上主键索引,查看主键索引show index table [表名]

image.png

给字段unique_num创建唯一索引,使用create [索引类型] [索引名称] on [表名] [索引字段]

image.png

此时如果我们像其中添加两条一模一样的数据,会抛出如下异常。

image.png

给字段desc创建全文索引,换一种创建索引的方式,alter table [表名] add [索引类型] [索引字段]

image.png

alter table test_index add unique index idx_full_desc(desc(50)); 给前50个字符加上了索引。

2.删除索引

alter table test_index drop index idx_full_desc;

image.png