MySQL之索引

1.索引引入:

  • 众所周知数据库是用来进行数据存储的,它很基础但是很重要。在实际应用时大量数据存在是必然的,那么在亿万数据中找到一个数据的困难程度可以用大海捞针来形容。为了提高人们在数据库中的查找效率引入了索引,它会提高人们在数据库中查找一条记录的效率。
  • 实质遵循空间换时间的理念

2.是什么?:

  • 官方定义:
    在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。啊这,看着好复杂呀。那就看下边的形象理解。
  • 形象理解:
    把数据库理解为图书馆:数据库是用来存储数据的,也就是图书馆是用来存放书籍的。在图书馆借阅参考书时,你肯定不会从1楼的第一个书架的第一层的第一本书向上找。这样找下去估计你没找见书你们的课程已经学完了。在找书时我们肯定会查找图书馆目录,然后直线突击,提高效率。那么在数据库中查找东西也是相同的,要是给数据库中的记录标上目录,在查询到的时候就能大大提高效率。解释这么多,就是一个字“数据库中的索引相当于图书馆中的目录,能提高在数据库中的查找效率

3.解决的问题:

  • 上边也解释的很清楚了,在现在的大数据时代,亿万条数据是常见的。为了能提高在数据库中查找一条数据的效率,引入了索引。它能提高在数据库中查询一条记录的效率。

4.适用场景:

  • 数据库中数据存放量很大:数据量很大时再考虑用索引,你要是一个表里边就几条数据,就不要花里胡哨的创建索引。因为索引在创建的时候是占据内存资源的,几条数据时没必要创建索引,大材小用了。就好比你开车去100公里外加了10块钱的油,这不扯淡吗。
  • 适用于频繁查找,偶尔增删改的操作:索引的引入就是为了解决频繁查找数据操作的。但是偶尔增删改怎么说?人生中所有的得到都是要付出代价的,爱情一样,数据库也一样哈。索引在创建出来之后确实能提高查询效率,但是它的创建同时也占据了一定的内存资源,那么我们在进行增、删、改操作的时候势必要同步索引结果,这样一来是有开销的。因此一个字:“在经常进行查找操作,极少进行增、删、改操作时考虑索引。

5.内部数据结构(树型结构)

1)下定义:

  • 索引的内部数据结构是B + 树,这样有查询效率高,并且保持有序。

2)为啥要用B +树结构

  • 索引的引入是为了提高查询效率的。所以重点就落在了查询两个字上。在数据结构中能查询的数据结构非常多,但是首先能进入我们脑子的就是哈希表和二叉搜索树
  • 为啥不用二叉搜索树:在学二叉搜索树的时候它就是为了提高查找效率的。话是不假,它只适用于少的数据查找。必定二叉搜索树一个节点最多能存两个数据,二叉二叉就只能二分查找。若当下有一亿条数据,那这二叉搜索树的高度岂不是太高,递归的层数也太深了、中序遍历结果时效率没有那么高,不能采用。
  • 为啥不用哈希表:在哈希表里边一个key对应一个value,看起来查找效率很高,时间复杂度是O(1)。但这种查询是有局限性的,它只能查询一条记录,不能查询一段记录。不要忘了我们在进行查询的时候有时会查询A~B的内容的,哈希表不能完成这样的功能,不采用。
  • 为啥要用B+树:要想知道这个问题就要了解B+树的结构特点,B+树又叫做N叉树,具备二叉树的基本特点但是又有变化。要讲清楚B+ 树我们就要先引入B树。
    下边详细介绍。

3)B 树理解:

  • 先看一下B树长啥样:
    在这里插入图片描述

  • 不同于二叉搜索树的是B树的每一个节点存的数据不止是两个,可以是多个。所以它的底下有N个节点,叫做N叉。

  • 它将原来 “瘦高”结构的二叉搜索树变为了 “矮胖”的N叉树。

  • 它也遵循所有左边节点的值小于根节点,所有右边节点值大于根节点。并且每个节点上的元素都是升序排列的。

  • 每个节点存的数据的个数和该节点的度相关,存储数据的个数都等于树的节点数加1。

  • 4)B树查询流程:
    在这里插入图片描述

5)B+ 树:

  • 还是先看结构:B+ 树是在B树基础上在进行改进的。
    在这里插入图片描述

  • 特点1:在B树的基础上将叶子节点都连在了一起,如上图将最后一层的都连在一起,长得像链表一样。这样让叶子节点上的所有数据之间内部有了关系,方便查询,提高了效率。

  • 特点2:树的节点之间有重复的元素。且父节点的元素值都会出现在子节点的最左端或者最右端。

  • 基于B+ 树构建的索引查询效率又会有提高,在图中也进行了说明,除了叶子节点之外其他的非叶子节点只是辅助进行查找操作,真正的数据存放在叶子节点上。

  • 非叶子节点上的辅助查找的数据放在内存上,这些辅助查找的就相当于索引,数量少的放在内存上能提高效率。把真正的数据放在叶子节点上,叶子节点的所有数据存放在磁盘上,磁盘的空间大能存放大量数据,这样在查找的时候就不用反复在磁盘中读数据,减少了磁盘读数据次数,也就大大的提高了查询效率。

6.索引的使用:

  • 查看索引: SHOW INDEX FROM 表名
  • 创建索引:CREATE INDEX 索引名 ON 表名
  • 删除索引:DROP INDEX 索引名 ON 表名

7.注意事项:

  • 在出现大量数据存放的时候才考虑使用索引。
  • 索引不论是在创建还是最后删除时都是很耗时的操作。
  • 索引的设计理念就是用空间换时间,创建索引确实能提高查找速率,但是索引的创建占据了一定的内存资源。
  • 删除索引时主键索引不能删除。
  • 索引能提高查询效率,但是会拖慢增、删、改操作,因为在操作这三个的时候势必要同步结果,会有开销。
  • 用EXPLAIN能分析一条SQL的执行过程,进而能查看是否使用索引以及使用了哪个索引。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值