MySql索引

目录

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创建原则

1.索引

MySQL当中的索引是一种数据结构,用于帮助用户快速查询数据库当中的内容,即数据库存储引擎为表中的数据所建立的一个目录。

1.1基本内容

1.1.1类型

  • 主键索引(Primary Key Index):主键索引是一种特殊的索引,用于唯一标识表中的每一行数据。每个表只能有一个主键索引,并且主键值在整个表中必须是唯一的,不允许有NULL值。
  • 唯一索引(Unique Index):唯一索引要求索引列中的值是唯一的,但允许有一个NULL值。一个表可以有多个唯一索引,但通常情况下,每个索引列应该只包含一个唯一索引。
  • 普通索引(Non-Unique Index):普通索引是最常见的索引类型,它允许索引列中有重复的值。它可以显著加速数据检索,但不要求列中的值是唯一的。
  • 全文索引(Full-Text Index):全文索引用于全文搜索,适用于包含大量文本数据的列,如文章内容或产品描述。它允许通过自然语言进行关键词搜索,并且支持全文搜索相关的操作。
  • 组合索引(Composite Index):组合索引是由多个列组合而成的索引,它可以包含两个或更多的列。组合索引可以更好地支持联合查询,提高多列条件搜索的性能。

1.1.2创建

我们创建表,为表中信息添加主键、唯一键和外键形容时,数据会会自动的针对指定字段创建索引。我们创建表时,可以使用index关键字进行普通索引的声明;我们修改表结构时,也可以给指定的字段添加索引。

我们创建表student,并为sn和name添加主键约束和唯一键约束,具体表结构内容如下:

MySql索引_第1张图片

1.1.3查看

查询索引有三种方法,分别是:

show index from 表名

以及

show keys from 表名

需要注意的是:查询时,显示到的信息可能较为杂乱,我们可以在后面跟注\G来让信息显示有序。

或者最基本的:

desc 表名

使用desc关键字来查看表结构,不过这样查看信息会稍显简略。

其中,使用show index和show keys得到的查看结果如下:

MySql索引_第2张图片当我们在表之后添加\G之后,显示得到结果如下:

MySql索引_第3张图片

可以较为明显的查看出各项索引的每位关键信息。

1.1.4删除

删除可以通过两种方式来完成,首先第一种是drop关键字:

drop index 索引名 on 表名;

 第二种是通过修改表结构来完成索引的删除,即使用alter关键字:

alter table 表名 drop index 索引名;

值得注意的地方是,当我们需要删除主键索引的时候,不需要纠结于主键索引的名称,因为其只存在一份,故删除时不指明索引名称,也不会产生任何歧义。具体的删除主键字段如下:

alter table 表名 drop primary key;

1.2底层内容

我们创建表之后,可以使用show create字段来查看创建表时候的信息如下:

MySql索引_第4张图片

而在InnoDB存储引擎当中索引的数据结构采用的便是:B+树。

1.2.1B+树

B+树的本质上是一种多叉树,特别适用于磁盘存储和范围查询。其在据库管理系统中用于实现索引结构,可以快速地定位和检索数据,提高数据库查询性能。

MySql索引_第5张图片 B树
MySql索引_第6张图片 B+树

可以通过下述网站查看B树和B+树的演化过程:

Data Structure Visualization (usfca.edu)icon-default.png?t=N6B9https://www.cs.usfca.edu/~galles/visualization/Algorithms.html在B+树当中,只有叶子节点存放具体的数据内容,其余节点存放的内容为索引信息。这也是B+树和B树最大的区别,B树并不设置单独的索引内容,它的全部节点皆是存放的数据内容。

针对B树和B+树,每个节点都存放至少两个指针,即左指针和右指针,左右指针域分别代表小于和大于本节点的数据。这代表B树和B+树具备平衡搜索树的特性。

其次,B+树当中的叶子节点通过一个链表连接,使得范围查询更高效,因为可以直接遍历链表来获取范围内的数据。而B树并不存在链表连接叶子节点。

最后,让我们思考一个问题,即为什么在数据库底层存储索引的数据结构要使用带索引的B+树,而非仅有数据内容构成的B树?

这个问题的答案我们可以从多个角度来进行探讨:

  1. 更适合磁盘存储:B+树相比于B树有更好的磁盘存储性能。B+树的非叶子节点只存储索引键值,而实际数据都存储在叶子节点中,且叶子节点形成一个有序链表。这样,B+树的叶子节点在磁盘上是连续存储的,减少了磁盘IO次数,提高了查询性能。而B树的每个节点都包含实际数据,导致节点大小较大,可能导致频繁的磁盘读写,影响性能。
  2. 范围查询性能:B+树由于有序性和叶子节点的链表结构,更适合执行范围查询操作。在B+树中,通过遍历叶子节点链表即可获取指定范围内的数据。而在B树中,由于非叶子节点也包含实际数据,范围查询可能需要多次磁盘访问,性能较低。
  3. 更高的节点利用率:B+树通过将实际数据仅存储在叶子节点中,使得非叶子节点可以存储更多的索引键值。这样可以减少树的高度,降低了查询所需的IO次数,提高了查询性能。而B树的非叶子节点存储实际数据,节点大小受限,可能导致树的高度较高,性能受影响。
  4. 简化索引维护:在B+树中,插入和删除操作只涉及到叶子节点的调整,非叶子节点不需要更新实际数据。这样使得索引的维护更加简单高效。而在B树中,插入和删除操作可能涉及到非叶子节点的更新,增加了维护的复杂性。

所以,综上所述,B+树相比于B树更适合作为数据库底层存储索引的数据结构,因为它能更好地利用磁盘存储,提供更高的查询性能,并简化索引的维护过程。这些优势使得B+树成为数据库系统中最常见的索引结构之一。

1.3使用方式

在默认的InnoDB存储引擎当中,默认使用的索引使用方式是聚簇索引;在MyISAM存储引擎当中,默认使用的索引使用方式是非聚簇索引。

1.3.1聚簇索引

在MySQL中,聚簇索引是一种特殊类型的索引,它将数据行存储在索引的叶子节点中,而不是存储在独立的数据页中。这使得索引和数据行紧密集成在一起,形成一个聚簇结构。聚簇索引在数据库表中只能有一个,通常是表的主键或唯一约束。

在聚簇索引当中索引数据和用户数据是存放在一起的,并且一张表只能有一个聚簇索引,且聚簇索引数据与索引物理存储顺序保持一致(有序)。

在表中除了聚簇索引还有辅助索引,而在聚簇索引类型中,辅助索引的叶子节点中存放的并不是用户数据,而是聚簇索引的键值。

1.3.2非聚簇索引

在MySQL中,非聚簇索引是相对于聚簇索引而言的。非聚簇索引将索引和实际数据行分开存储,将索引键值存储在索引的叶子节点中,而实际数据行存储在独立的数据页中。与聚簇索引不同,一个数据库表可以拥有多个非聚簇索引。

在非聚簇索引当中索引数据和用户数据是分离存储的,索引的叶子节点中存储的是数据的地址,因此索引的顺序,与数据在物理磁盘的实际存储顺序不一致。  

在非聚簇索引当中的辅助索引,其和主键索引并无任何区别,都是叶子节点中存放数据的地址。

1.3.3总结

  • 如果经常需要范围查询或者需要频繁访问特定范围的数据行,聚簇索引可能更为高效。
  • 如果需要频繁进行特定键值查找,且插入和更新操作较为频繁,非聚簇索引可能更为合适。
  • 在某些情况下,可以同时使用聚簇索引和非聚簇索引来满足不同类型的查询需求。

1.4创建原则

  • 比较频繁作为查询条件的字段应创建索引;
  • 更新较为频繁的字段不适合创建索引,会造成过分内存开销;
  • 唯一性太差的字段不适合作为索引,即使频繁作为查询条件;
  • 在where子句中不出现的字段不该创建索引。

你可能感兴趣的:(MySql基础,mysql,数据库)