目录
1.索引
1.1基本内容
1.1.1类型
1.1.2创建
1.1.3查看
1.1.4删除
1.2底层内容
1.2.1B+树
1.3使用方式
1.3.1聚簇索引
1.3.2非聚簇索引
1.3.3总结
1.4创建原则
MySQL当中的索引是一种数据结构,用于帮助用户快速查询数据库当中的内容,即数据库存储引擎为表中的数据所建立的一个目录。
我们创建表,为表中信息添加主键、唯一键和外键形容时,数据会会自动的针对指定字段创建索引。我们创建表时,可以使用index关键字进行普通索引的声明;我们修改表结构时,也可以给指定的字段添加索引。
我们创建表student,并为sn和name添加主键约束和唯一键约束,具体表结构内容如下:
查询索引有三种方法,分别是:
show index from 表名
以及
show keys from 表名
需要注意的是:查询时,显示到的信息可能较为杂乱,我们可以在后面跟注\G来让信息显示有序。
或者最基本的:
desc 表名
使用desc关键字来查看表结构,不过这样查看信息会稍显简略。
其中,使用show index和show keys得到的查看结果如下:
可以较为明显的查看出各项索引的每位关键信息。
删除可以通过两种方式来完成,首先第一种是drop关键字:
drop index 索引名 on 表名;
第二种是通过修改表结构来完成索引的删除,即使用alter关键字:
alter table 表名 drop index 索引名;
值得注意的地方是,当我们需要删除主键索引的时候,不需要纠结于主键索引的名称,因为其只存在一份,故删除时不指明索引名称,也不会产生任何歧义。具体的删除主键字段如下:
alter table 表名 drop primary key;
我们创建表之后,可以使用show create字段来查看创建表时候的信息如下:
而在InnoDB存储引擎当中索引的数据结构采用的便是:B+树。
B+树的本质上是一种多叉树,特别适用于磁盘存储和范围查询。其在据库管理系统中用于实现索引结构,可以快速地定位和检索数据,提高数据库查询性能。
可以通过下述网站查看B树和B+树的演化过程:
Data Structure Visualization (usfca.edu)https://www.cs.usfca.edu/~galles/visualization/Algorithms.html在B+树当中,只有叶子节点存放具体的数据内容,其余节点存放的内容为索引信息。这也是B+树和B树最大的区别,B树并不设置单独的索引内容,它的全部节点皆是存放的数据内容。
针对B树和B+树,每个节点都存放至少两个指针,即左指针和右指针,左右指针域分别代表小于和大于本节点的数据。这代表B树和B+树具备平衡搜索树的特性。
其次,B+树当中的叶子节点通过一个链表连接,使得范围查询更高效,因为可以直接遍历链表来获取范围内的数据。而B树并不存在链表连接叶子节点。
最后,让我们思考一个问题,即为什么在数据库底层存储索引的数据结构要使用带索引的B+树,而非仅有数据内容构成的B树?
这个问题的答案我们可以从多个角度来进行探讨:
所以,综上所述,B+树相比于B树更适合作为数据库底层存储索引的数据结构,因为它能更好地利用磁盘存储,提供更高的查询性能,并简化索引的维护过程。这些优势使得B+树成为数据库系统中最常见的索引结构之一。
在默认的InnoDB存储引擎当中,默认使用的索引使用方式是聚簇索引;在MyISAM存储引擎当中,默认使用的索引使用方式是非聚簇索引。
在MySQL中,聚簇索引是一种特殊类型的索引,它将数据行存储在索引的叶子节点中,而不是存储在独立的数据页中。这使得索引和数据行紧密集成在一起,形成一个聚簇结构。聚簇索引在数据库表中只能有一个,通常是表的主键或唯一约束。
在聚簇索引当中索引数据和用户数据是存放在一起的,并且一张表只能有一个聚簇索引,且聚簇索引数据与索引物理存储顺序保持一致(有序)。
在表中除了聚簇索引还有辅助索引,而在聚簇索引类型中,辅助索引的叶子节点中存放的并不是用户数据,而是聚簇索引的键值。
在MySQL中,非聚簇索引是相对于聚簇索引而言的。非聚簇索引将索引和实际数据行分开存储,将索引键值存储在索引的叶子节点中,而实际数据行存储在独立的数据页中。与聚簇索引不同,一个数据库表可以拥有多个非聚簇索引。
在非聚簇索引当中索引数据和用户数据是分离存储的,索引的叶子节点中存储的是数据的地址,因此索引的顺序,与数据在物理磁盘的实际存储顺序不一致。
在非聚簇索引当中的辅助索引,其和主键索引并无任何区别,都是叶子节点中存放数据的地址。