当前位置:   article > 正文

索引详细解读_对索引的理解

对索引的理解

索引

1、概述

    索引类似图书中的目录索引,可以提高数据检索的效率,降低数据库的IO成本。
    Mysql官方的定义:
    索引(Index)是帮助MySQL高效获取数据的数据结构。
    可以理解为:快速查找排好序的一种数据结构。
    MySQL在300万条记录左右性能开始逐渐下降,虽然官⽅方⽂文档说500~800w记录,所以我们就有必要使用上索引了。
  • 1
  • 2
  • 3
  • 4
  • 5

2、索引的分类

  • 主键索引
  • 唯一索引
  • 普通索引
  • 全文索引
  • 组合索引
2.1、主键索引

即主索引,根据主键创建的索引,不允许重复,不允许为空值。
如果表中没有定义主键,InnoDB会选择一个唯一的非空索引代替。
如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引。
在这里插入图片描述

2.2、唯一索引

用来建立索引的列的值必须是唯一的,可以为空。
在这里插入图片描述

2.3、普通索引

用表中普通的列构建的索引,没有任何限制

在这里插入图片描述

2.4、全文索引

用大文本对象的列构建的索引
在这里插入图片描述
5.6版本之前,全文索引只能用于MyISAM储存引擎
5.6版本及以后,MyISAM和InnoDB都支持全文索引
在MySQL8之前,全文索引只对支持英文索引,对中文还不支持
MySQL8中支持了对中文分词的全文索引。
那么问题来了,问什么支持中文:
因为中文和英文有本质上的区别。英⽂是单词语句组成,⽽且都有空格,好分辨,中文是有字组成的句,⽽且有不同的意思,因此不一样。 当然目前中文分词技术已经非常成熟了,因此的mysql8种⽀持了中文的全⽂索引。

2.5、组合索引

用多个列组合而成的索引,这多个列中不允许有空值
在这里插入图片描述

  • 组合索引的最左原则
    在这里插入图片描述

索引就是为了提高数据检索的速度,不同的索引类型要求和效率也是不一样的。

3、索引原理

只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,
然后在hashCode相应的位置存执该值所在行数据的物理理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,⽽且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能
正常情况下,如果不指定索引的类型,那么一般是指B+Tree索引。
存储引擎以不同的方式使用B+Tree索引。性能也各有不同,但是InnoDB按照原数据格式进⾏存储。

B+TREE索引
B+TREE其实就是B+树,而B+树其实就是B树演变过来的,所以首先要了解B树,了解B树之前要先知道二叉树。

顺序查找:就是从第⼀一个元素开始,按索引顺序遍历待查找序列列,直到找出给定⽬目标或者查找失败
在这里插入图片描述
缺点:效率低–需要遍历整个待查询序列

二分查找法:也称为折半法,是⼀一种在有序数组中查找特定元素的搜索算法。

在这里插入图片描述
在这里插入图片描述
二叉树也存在缺点,就是当数据是顺序插入时就会改变树的形态(在非完全二叉树的时候)

平衡二叉树演变过程:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
平衡二叉树经过条件的控制,再通过旋转的⽅式,完成树的平衡,不过,旋转次数过多。

在平衡二叉树稳定性的基础上,再进行优化,减少旋转次数,保证树的平衡性。
树的查找性能取决于树的高度,让树尽可能平衡,就是为了降低树的高度。

红黑树
在这里插入图片描述

当数据存在内存中,红黑树的效率非常高,但是文件系统和数据库都是存在硬盘上的,如果数据量过大的话,不能一次性加载到内存。
所以一棵树都无法一次性加载进内存,就没法进行查找。
因此就出现了专为磁盘等存储设备而设计的一种平衡多路查找数,也就是B树,与红黑树相比,在相同的节点情况下,一颗B树的高度远远小于红黑树的高度

B树:
B树即平衡查找树,是一种平衡树状数据结构,一般较多用于存储系统上,比如数据库或者文件系统。

3阶B树演变过程:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查找这个树中的数字7,需要3步
查找数字10,需要2步

通过这个查询步骤可以总结到:
1、查找7和10所用到的步数不一样,所需的时间不同,效率就不均衡。
2、在进行范围查找时,需要反复的返回上一节点,在进入下一节点,这种情况其实是树的遍历,叫做中序遍历,消耗了了时间
3、还有最重要的一点,在B树中,由于每一个节点就是一行数据,那么就是一次IO读区的节点更少。

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

在这里插入图片描述
B+树是在B树的基础上进行演变

B+树特征
1、B+树只有叶子节点存储数据
2、非叶子节点起到了索引的作用
3、所有叶子节点使用链表相连

优点:
1、磁盘读写代价更低
B树的数据和索引都是在同一节点上,那么每个快中包含的索引是少量的,如果想要去除比较深层的数据,意味着要读取更多的块,才能得到想要的索引和数据,那么增加了IO次数
而B+树中每个块能存储的索引是B树的很多倍,那么获取比较深层的数据,也只需要读取少量的块就可以额,那么减少了磁盘的IO次数
2、随机IO的次数更少
随机IO是指读写操作时间连续,但访问地址不连续,时长约为10ms
顺序IO是指读取和写入操作基于逻辑块逐个连续访问来自相邻地址的数据,时长约为0.1ms
在相同情况下,B树要进行更多的随机IO,而B+树需要更多的顺序IO,所以B+树效率更快
3、查询速度更加稳定
由于B+树非叶子节点不存储数据,因此所有的数据都要查询到叶子节点,而叶子结点的高度都是相同的,所以所有的数据的查询速度都是一样的

4、聚簇索引和非聚簇索引

聚簇索引:索引即数据,数据即索引
非聚簇索引:找到索引仅仅是找到当前索引值和key,如果需要找到索引外的内容,需要回表。

在这里插入图片描述

在这里插入图片描述

5、MyISAM和InnoDB的区别

1、数据存储方式

  • InnoDB由两种⽂文件组成,表结构,数据和索引
  • MyISAM由三种⽂文件组成,表结构、数据、索引
    2、索引的方式
  • 索引的底层都是基于B+Tree的数据结构建⽴立
  • InnoDB中主键索引为聚簇索引,辅助索引是⾮非聚簇索引
  • MyISAM中数据和索引存在不不同的⽂文件中,因此都是⾮非聚簇索引
    3、事务的支持
  • InnoDB⽀支持事务
  • MyISAM不不⽀支持事务

6、索引使用与优化总结

1、合理建立索引,创建了之后不一定用上,占用内存空间
2、多个单列索引并不是最佳选择,mysql只能使用一个索引,因此多个单列索引并不能提高查找性能,为了提高查询性能,合理简历组合/联合索引(最佳左前缀原则)
3、尽可能达成索引覆盖,如果一个索引包含所有需要查询的字段的值,直接根据索引的查询结果返回数据,而无需读表,能够极大的提高性能。因此,可以定义一个让索引包含的额外的列,解释这个列对索引而言是无用的。
4、sql语句避免嵌套语句
5、避免多表查询

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/168449?site
推荐阅读
相关标签
  

闽ICP备14008679号