MySQL--索引

参考文献

  1. [MySQL索引连环18问!] https://zhuanlan.zhihu.com/p/364041898
  2. [深入理解MySQL索引] https://www.infoq.cn/article/ojkwyykjoyc2ygb0sj2c
  3. [聚集索引和非聚集索引的区别] https://juejin.cn/post/7001094401858469918
  4. [索引分类] https://blog.csdn.net/dd2016124/article/details/125134967

MySQL--索引_第1张图片

1. 索引疑惑

1.1 索引是什么?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。而且索引是一个文件,它是要占据物理空间的。

一句话总结:索引是帮助数据库高效获取数据的数据结构

1.2 索引的分类

  • 从存储结构上来划分,索引主要有:Btree 索引(B+tree,B-tree)、哈希索引、全文索引等
  • 从功能逻辑上说,索引主要有4类,分别是普通索引、唯一索引、主键索引、全文索引。
  • 按照物理实现方式,索引可以分为2种:聚集索引和非聚集索引。
  • 按照作用字段个数进行划分,分成单列索引和联合索引。

1.2.1 普通索引

在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表 student 的字段 name 上建立一个普通索引,查询记录时就可以根据该索引进行查询。

1.2.2 唯一索引

使用 UNIQUE 参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值(该空值也可以有多个)。在一张数据表里可以有多个唯一索引。
例如,在表 student 的字段 email 中创建唯一性索引,那么字段 email 的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录。

1.2.3 主键索引

主键索引其实并不是一种索引类型,而是根据主键,在主键上建立聚集索引,主键是具有唯一性且不能为空。一张表里最多只有一个主键索引。这是由于其底层数据的物理存储方式决定的,数据存储在文件中只能按照一种顺序进行存储。

1.2.4 聚集索引和非聚集索引

1.2.4.1 聚集索引

聚集索引就是基于主键来构建的索引结构。聚集索引就是按照每张表的主键来构建一颗B+树,该B+树叶子节点里面存储了这个表的每一行数据记录。

1.2.4.2 非聚集索引

除聚集索引外都称为非聚集索引,非聚集索引底层构建的B+树叶子节点里面存储了这个表的每一行数据的地址。如果要真正得获取行数据,还需要访问主键索引来进行数据的检索。

1.2.4.3 聚集和非聚集索引的区别

  • 简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。
  • 由于在InnoDB引擎里面,一张表的数据对应的物理文件本身就是按照B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗B+树,然后叶子节点里面存储了这个表的每一行数据记录。
  • 所以基于InnoDB这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一种数据的存储方式。
  • 同时也意味着每个表里面必须要有一个主键,如果没有主键,InnoDB会默认选择或者添加一个隐藏列作为主键索引来存储这个表的数据行。一般情况是建议使用自增id作为主键,这样的话id本身具有连续性使得对应的数据也会按照顺序存储在磁盘上,写入性能和检索性能都很高。否则,如果使用uuid这种随机id,那么在频繁插入数据的时候,就会导致随机磁盘IO,从而导致性能较低。
  • 需要注意的是,InnoDB里面只能存在一个聚集索引,原因很简单,如果存在多个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,以及数据维护的困难。
  • 由于在InnoDB里面,主键索引表示的是一种数据存储结构,所以如果是基于非聚集索引来查询一条完整的记录,最终还是需要访问主键索引来检索。

1.3 索引有哪些优缺点?

(1) 索引的优点如下:

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
  • 可以给所有的 MySQL 列类型设置索引。
  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
  • 在实现数据的参考完整性方面可以加速表与表之间的连接。
  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

(2) 增加索引也有许多不利的方面,主要如下:

  • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

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