0


理解MYSQL的索引

文章目录

一、索引的概念

索引是一种数据结构,包含对数据库中所有记录的引用指针,使用索引就可以快速的访问数据库表中的信息。通俗来说,一本书的目录就是一个索引表,读者可以通过目录快速的找到对应的章节内容。数据中,表、数据、索引的关系,类似于书架上图书、图书内容、目录的关系。可以对数据库表中的一列或者多列创建索引,快速定位,进行查找。

如果要查找数据,先使用索引查询。找到索引对应的物理地址,再进行具体内容的访问。减少了比较次数,加快比较效率。如果数据库没有使用索引进行查询,就是要将整个数据进行遍历去找到匹配的数据,这样效率会低很多。

二、索引的优缺点

1.优点

  • 索引可以提高查找的效率,减少I/O次数
  • 可以利用索引进行分组、排序,加快分组、排序

2.缺点

  • 占用额外的存储空间,数据量越大,消耗的空间越大
  • 虽然查找速度提高了,但是拖慢了增删改的效率。比如,增删改会使数据的内容发生变化,数据库不仅需要保存新的数据,同时也要保存索引对应的新的数据内容,调整索引结构。

三、使用场景

  • 数据量较大,经常要进行对列的查询
  • 数据表中的增删改操作,以及对列的修改频率比较低
  • 索引存储在磁盘文件上,索引会占用额外的空间

满足以上条件可以创建索引,提高查找效率。反之,如果磁盘空间不足,或者对列的查询频率低,可以不考虑索引查询。

四、索引的使用

  1. 查看索引 查看表中都有哪些索引
showindexfrom 表名;
  1. 给某列创建索引
createindex 索引名 on 表名(列名);

但是,创建索引是一件低效率的事,尤其在数据量很大的时候

  1. 删除索引
deleteindex 索引名 on表名;

五、索引背后的数据结构

如何实现索引与数据内容的对应关系?

  • 顺序表和链表这两个数据结构,实现按值查找,需要进行遍历,效率是比较低的。但是顺序表按照下标访问元素,时间复杂度为O(1),还是很快的,链表查找的时间复杂度为O(n)
  • 二叉搜索树二叉搜索树最坏情况下的查找时间复杂度为O(n),就是单枝树的情况。树的高度越高,比较次数也越多,以为者I/O次数增多最好情况: 复杂度:O(logn)在这里插入图片描述最坏情况 复杂度:O(n)在这里插入图片描述
  • AVL树要求左右两颗树的高度差不超过1
  • 红黑树 是要求更加宽松的平衡二叉树

二叉树最大的问题就是,数据很多的时候,树的高度高,比较次数多。而mysql的比较,就意味着磁盘I/O

  • hash表 hash表的查找时间复杂度是O(1),但是只能进行"相等"的查找,不能进行范围查找
  • 堆 堆只能找出最大。或者最小的数据

所以,需要用树形结构,使用多叉搜索树。

  • 多叉搜索树

首先,先介绍B树和B+树。

1、 B树

  • 节点上会存储n个Key值,n个Key值对应n+1个区间,每个区间对应一个子树。
  • B树的查找过程和二叉树非常相似。从根节点出发,根据待查找元素,确定查找区间,依次查找。
  • 区别在于,二叉搜索树的查找效率和高度相关,每个节点比较一次。B树的高度虽然低了,但是每个节点比较多次,查询比较次数增多了,意味着磁盘的I/O次数也会增多。B树:在这里插入图片描述

2、 B+树
与B树类似,做了改进。

B+树:
在这里插入图片描述

  • n个节点,每个节点存储多个Key值,有n个区间
  • 父节点在每一个子节点中都有体现
  • 父节点中的值,会作为子节点的最大/最小值(示例为最大值
  • 最下面的叶子节点,使用链表进行顺序连接

B+树的优点

  • 在数据量相同的情况下,B+树相对于B树更加“矮胖”。对于同一层来说,可以存储更多节点(索引),整体的I/O次数是减少的。
  • B+树的所有节点都保存在叶子节点中,中间节点只是查询的记录媒介,不存储真正的数据,所有的查询最终都落在叶子节点上。
  • 叶子节点用链表进行顺序连接,提高了查找的效率,并且适合区间查找。
  • B+树的查询比较稳定,有相同的I/O操作次数。每次查询都是从根节点到到叶子节点,因为所有的数据都在叶子节点中。B树的查找,性能不稳定,对于根节点的数据可能只进行一次I/O操作。但是对于叶子节点的数据,需要进行树的高度次I/O操作。
  • 叶子节点存储数据,非叶子节点存储key值即可,因此非叶子节点占用的空间很小。

所以B+树比较适合存储数据库中的索引。

标签: java

本文转载自: https://blog.csdn.net/baidu_41298300/article/details/123468123
版权归原作者 小涵子要努力呀 所有, 如有侵权,请联系我们删除。

“理解MYSQL的索引”的评论:

还没有评论