大家好,我是悟空。本文内容如下:一、前言最近整理了MySQL的核心知识,正好整理了MySQL索引相关的知识。我的很多文章风格都是原理+实战的方式带你去理解知识点,所以这篇文章也是如此。当然,关于索引还有很多知识点。这篇文章就是讲解索引的基础知识。不涉及索引的底层原理和如何查看执行计划。会分多篇来讲解,请继续关注~2、IndexingVSLibraries想象这样一个场景,你现在是一名图书管理员,每天的工作就是将归还的图书归位。如果有人要找某本书,可以先通过图书的分类、书号等找到该书所在的书架位置,进一步缩小范围。如果图书馆里没有图书管理员,书架上的书又是乱七八糟的,那要找一本书,就只能从头找了。能不能找到,全靠运气。如果你去过图书馆,你应该知道图书馆的检索系统。图书馆准备了图书的检索目录,包括书名、书号,以及相应的位置信息,包括在哪个区域、哪个书架、哪个楼层。我们可以通过书名或书号快速知道书所在的位置,从而得到自己需要的书。MySQL中的索引相当于图书馆的检索目录。它是一种帮助MySQL系统快速检索数据的存储结构。我们可以在索引中根据查询条件检索索引字段的值,然后快速定位到数据记录的位置,这样就不需要遍历整个数据表了。而且,数据表中的字段越多,表中的数据记录越多,速度提升就越明显。3、什么是指标?索引的英文名称是Index,是一种数据结构。数据结构是计算机存储和组织数据的方式。好的数据结构可以带来更高的运行或存储效率。数据在内存中是线性排列的,但是我们可以利用指针等道具来构造类似于“树”的复杂结构。数据结构按线性和非线性分为两大类,共有八种类型。例如,线性数据结构包括数组、链表、堆栈和队列。非线性数据结构包括树、堆、哈希表、图等。MySQL中的索引是哪一个?它是一个树型数据结构,它是一个B+树,如下图所示,但是图中的树是一颗根在顶端的倒置树。B+树B+树是如何存储数据的?我们可以打开这个网站看看。想象一下,我们在一个数据表中随机插入一些数字:2、5、8、100、20,类似于我们将图书馆的书随机放在书架上的方式,然后我们通过动画演示来看一下B+树如何根据其数据结构存储、查找和删除这些数字。4、MySQL索引的优缺点优点一:降低数据库的I/O成本。这实际上是为了减少在数据库中读取和写入数据所花费的时间。如果让你从一堆乱七八糟的书里找出一本指定的书,你是不是要一张一张地检查封面上写的书名是否正确?使用索引,您无需搜索每本书。我已经看过封面了,我可以快速找到那本书,减少了很多无用的搜索。优势二:保证数据的唯一性通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。注意这是一个唯一索引,唯一索引是通过关键字UNIQUE创建的。例如,employee表中的每个员工id都是唯一的。优势三:提高多表联合查询效率无论是单表查询还是多表查询,索引都可以提高查询效率。任何事物都有它的两个方面。索引有优点也有缺点,那么索引有什么缺点呢?缺点缺点一:索引的创建和维护都需要时间,就像在图书馆借书还书需要馆员维护一样。长期没人管,书不就又乱七八糟了吗?缺点二:索引需要占用磁盘空间,就像图书馆需要将每本书的位置信息存储在一个数据中一样。如果存储在电脑中,会占用电脑的硬盘空间。如果是用纸质文件来存放,会占用房间的空间。缺点三:降低更新表的速度就像是在图书馆放一本新书上架。管理员在上架前需要查询图书所在位置。这个查询过程会消耗很多时间。一定的时间。五、体验索引加速查询。如前所述,索引有很多优点。主要是为了提高查询速度。那么我们来看看不建索引和建索引两种场景下的查询速度。首先得建表,然后往表里面插入很多数据对不对?创建学生表我这里创建了一张学生表:字段说明:id:这条记录的id也是主键id,是唯一的,也就是说每条记录都是唯一的。stu_no:学号,插入样本数据时自增数字stu_name:学名,插入样本数据时英文字母随机组合age:学龄,插入样本数据时会随机分布classId:班级id,插入样本数据类id是随机分布的。插入300万条数据表创建完毕后,需要向表中插入大量数据。这里我直接用写好的脚本插入300万条数据。如果考试没有索引,如何查询是否要根据某个学号stu_no查找该学生的记录?查询脚本如下:现在student表没有建立索引,我们来看看它的查询速度。如何统计脚本执行的时间?因为我使用的是workbench图形化管理工具,所以可以通过这个工具查看执行时间:可以看到查询这条数据需要0.47s,从查询计划中也可以看到这条查询是全表scan也就是查询stu_no='555555'这条记录从记录的第一行开始,逐行扫描,看哪条记录有stu_no='555555',这种查询方式很慢,尤其是从如此大量的数据。测试添加索引的情况Addanindex如果我们给要查询的字段stu_no添加索引会怎么样呢?索引方式可以直接通过workbench工具,也可以通过脚本。添加索引脚本的工作台工具添加索引ALTERTABLE`test`.`student`ADDINDEX`index_stu_no`(`stu_no`ASC)VISIBLE;测试添加索引后的查询速度添加索引后,查询只需要0.0013s,如下图温馨提示:再看一下它的执行计划:可以看到使用索引查找直接定位到的行通过索引的数据。有了索引,MySQL在执行SQL语句时多了一个优化手段。也就是说,在查询的时候,可以先通过查询索引快速定位,然后找到对应的数据进行读取,大大提高了查询速度。6、如何创建索引在我们的工作中,通常会编写创建索引的SQL脚本,然后将脚本提交到代码仓库。这使得维护SQL脚本和索引变得更加容易。创建索引的脚本怎么样?有语法要求吗?创建索引的方式有以下三种:在创建表的同时创建索引语法:CREATETABLE表名(字段数据类型,字段数据类型,...{INDEX|KEY}索引名(字段1,字段2,...))例子:创建成员表时创建索引uk_idx_id,字段为id。创建表成员(idINTNOTNULL,nameVARCHAR(30)NOTNULL,INDEXuk_idx_id(id));直接为数据表创建索引语法:CREATEINDEX索引名ON表名(字段1,字段2,...);示例:创建索引index_name,字段为name。CREATEINDEXindex_nameONmember(name);添加索引更新表的语法ALTERTABLE表名ADD{INDEX|KEY}索引名称(字段1,字段2,...);示例:创建联合索引index_id_name,字段为id和name。ALTERTABLEmemberADDINDEXindex_id_name(id,name);7、索引分类MySQL索引包括普通索引、唯一索引、全文索引、单列索引、多列索引和空间索引。在功能逻辑上,主要有四种索引,分别是普通索引、唯一索引、主键索引和全文索引。根据物理实现方式,索引可以分为聚集索引和非聚集索引两种。根据功能字段的多少,分为单列索引和联合索引。聚簇索引(主键索引)的特点主键作为索引,B+树的叶子节点存储完整的用户记录,然后在聚簇索引上定位行记录,其性能低于扫描索引树(一般来说)。详细描述:一般我们自己建立的索引,不管是单列索引还是联合索引,都称为普通索引,对应的就是聚簇索引。每个普通索引对应一个独立的索引B+树,索引B+树的节点只包含索引中几个字段的值和主键值。根据索引树,根据条件找到需要的数据。它只是索引中几个字段的值和主键值。如果用select*,还需要很多其他的字段,所以要回表。根据主键,到主键的聚簇索引中查找。聚集索引的叶节点是数据页。只有找到数据页,才能提取一行数据的所有字段值。假设有一条select*fromtableorderbya,b,c的语句,(该表有abcdef的6个字段),首先要按照a,b的顺序从联合索引的索引树中取出所有数据,c,然后对每条数据从主键到聚簇索引进行查找,但是性能不高。组合索引(二级索引,复合索引)特性同时为多个列创建索引。8、创建不同的索引,体验更快的查询。创建聚集索引以体验更快的查询。我们之前在创建student表的时候,添加了一个以id为索引字段的主键索引(聚簇索引),那么我们来看看主键id查询Sample的速度有多快。如果之前没有给这张表添加主键索引,可以通过这个脚本添加:#id不为空,自增主键,自动添加聚簇索引ALTERTABLE`test`.`student`CHANGECOLUMN`id``id`INTNOTNULLAUTO_INCREMENT,ADDPRIMARYKEY(`id`);在执行计划中可以看到,是直接用constant方式,说明查询直接找到了记录,速度很快。然后我们删除主键索引,再看查询时间。先删除主键索引:ALTERTABLE`test`.`student`CHANGECOLUMN`id``id`INTNOTNULL,DROPPRIMARYKEY;查询需要0.6秒。而且查看执行计划是全表扫描,是一种非常耗时的查询方式。创建普通索引会加快查询速度。在本文的第5节中,我们已经通过对stu_no学号创建一个普通的索引来演示查询效果,索引也加快了查询速度。创建联合索引将加快查询速度。在没有索引的情况下,查询age=15,classid=20students,耗时0.46秒。在学生表的age和classId字段上创建联合索引:CREATEINDEXindex_age_class_idONtest.student(age,classId);查询语句:SELECT*FROMtest.studentWHEREage=15ANDclassId=20;需要0.014秒。0.46秒减少到0.014秒,加速了30倍。总结本文介绍了什么是MySQL索引,它们的优缺点,MySQL索引分类,以及如何通过脚本创建MySQL索引。最后,它演示了不同类型的索引如何加速查询。在下一篇MySQL文章中,我们将继续讲MySQL索引。关于我8年互联网开发经验,擅长微服务、分布式、架构设计。目前在一家大型上市公司从事基础设施和性能优化工作。InfoQ签约作者,蓝桥签约作者,阿里云专家博主,名人。
