写点什么

mysql 基础——认识索引

  • 2023-08-25
    福建
  • 本文字数:2364 字

    阅读完需:约 8 分钟

mysql基础——认识索引

一、介绍

“索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。

二、优缺点

优势:以快速检索,减少 I/O 次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;

劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表

三、何时添加索引

我们在下面三种情况下会考虑给字段添加索引:

1.数据量庞大

毋庸置疑,数据量庞大时添加索引明显能够提升查询效率

2.字段作为查询条件

该字段老是出现在 where 语句后面,老是被扫描。

3.该字段很少进行插入,修改,删除操作

因为做这些操作,索引需要重新排序


注意:

1.主键上,以及 unique 字段上都会自动添加索引的(所以查询的时候尽量通过有主键或者带有 unique 字段进行查询)

​2.建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能

四、索引语法

创建索引

create index student_name_index on student(name);

这条命令的意思是:在学生表 student 的 name 字段上创建索引,名字是 student_name_index,使用的时候结合自己的表来替换对应的东西。

删除索引

drop index student_name_index on student;

这条命令的意思是:将学生表 student 上的 student_name_index 索引对象删除,使用的时候结合自己的表来替换对应的东西。

是否使用索引检索

举例:

对一张 comment 表的 content 字段进行查询,发现查询出来的行数是 19 行,而这张表的行数也是 19 行,没有使用索引检索,如下:

explain select * from comment where content = '很好';



给该字段创建索引,然后再进行查看。



有使用索引进行查询,查询出来的条数是两条(因为我这个表里 content 字段有两条记录是“很好”。)

五、索引的分类


单一索引:顾名思义,就是在一个字段上添加索引。

语法跟上面说的一样,这里不重复。


主键索引:这是在主键上添加索引,建表的时候通过 PRIMARY KEY(字段) 这种方式来设置主键,同时自动添加索引,注意,一张表只能有一个主键。


唯一索引:与单一索引类似,索引列的值必须唯一,允许有空值。

create unique index 索引的名字 on 表名(字段);


组合索引:两个或者更多的字段添加索引

alter table 表名 add index 索引的名字(字段,字段,字段);


例如:

六、索引失效的时候

%开头

字段采用模糊查询的时候是以“%”开头了,这种情况要尽量避免,如下图,查询还是全部查出来了。


or 两边有一边没有索引

查询的时候,使用 or。使用 or 那么要求 or 两边的条件字段都要有索引,才会走索引,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会失效,如下图。


索引参与运算

在查询条件中标记为索引的列参与运算,索引就失效。


索引使用函数

在查询条件中标记为索引的列使用函数,索引就失效了。


没有使用最左侧的列查询

使用复合索引的时候,查询时没有使用最左侧的列进行查询,索引失效。


七、面试题

1.索引的原理

MySQL 中的索引是通过 B+ 树实现的。B+ 树是⼀种多叉树,它可以将数据按照⼀定的顺序组织起来,从而提高查询效率。


B+ 树的所有数据都存储在叶子节点上,而非叶子节点只存储索引,这样可以提高数据查询效率。B+ 树的叶子节点之间使用指针相连,这样可以实现区间查找,也就是说,可以快速定位某个区间内的数据。


在 MySQL 中,B+ 树的实现主要是通过 InnoDB 存储引擎来实现的。InnoDB 存储引擎中的索 引主要有聚簇索引和辅助索引两种类型,聚簇索引是根据主键创建的索引,而辅助索引是根据非主键列创建的索引。

对于辅助索引,MySQL 中会同时创建⼀个对应的聚簇索引,这样可以提高查询效率。

2.覆盖索引和联合索引是什么?讲⼀下索引的最左前缀匹配原则。

覆盖索引和联合索引是数据库中常见的两种索引类型。 覆盖索引是指⼀个包含了所有查询需要的列的索引,查询时可以直接从索引中取到需要的数据,而不需要再回到表中查找,从而可以提高查询效率。 联合索引是指使用多个列组合起来作为⼀个索引,可以同时查询多个列,以提高查询效率。


联合索引可以包含多个列,但是查询时只能使用前缀列进行查询,即只有在查询中使用了联合索引的前几个列,才能利用联合索引进行查询。如果查询中没有使用前缀列,那么联合索引就不能发挥作用,需要使用单独的索引或全表扫描。最左前缀匹配原则是指如果⼀个联合索引包含了多个列,那么在查询时只能使用前面的列进行匹配。


例如,⼀个联合索引包含了 A、B、C 三列,那么查询时只能使用 A、AB 或 ABC 进行匹配, 而不能只使用 B 或 C 进行匹配。这是因为如果查询时使用的列不是最左前缀列,那 MySQL 就⽆法使⽤索引进行查询,会导致全表扫描,从而降低查询效率。 在实际的应用中,覆盖索引和联合索引可以结合使用,以提高查询效率。同时,使用最左前缀匹配原则可以让我们更加合理地设计索引,从而提高查询性能。


介绍一款好用的开发工具


JNPF,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

低代码是将开发过程中某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。因而极大的提高了程序员的生产效率。

官网:https://www.jnpfsoft.com?infoq ,如果你有闲暇时间,可以做个知识拓展。


这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。


为了支撑更高技术要求的应用开发,从数据库建模、Web API 构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动。

发布于: 刚刚阅读数: 3
用户头像

IT领域从业者 分享见解 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
mysql基础——认识索引_MySQL_树上有只程序猿_InfoQ写作社区