1、什么是索引?MySQL官方对索引的定义是:索引(Index)是一种帮助MySQL高效获取数据的数据结构,MYSQL使用的数据结构是:B+这里的树推荐大家看书,《深入理解计算机系统的书》1.1的局部性原则程序和数据访问倾向于聚集在一起。在一段时间内,只会用到其中的一小部分,而在不久的将来会用到的信息很可能接近空间地址(称为空间局部性)中当前使用的信息,或者程序最近访问过的代码和数据很可能很快会再次被访问(称为时间局部性)。1.2磁盘预读预读长度一般为一页的整数倍。页是内存的逻辑块。操作系统经常将主存和磁盘存储区划分为大小相等的连续块。每个内存块称为一个Pages(在很多操作系统中,页大小通常为4K),主存和磁盘以页为单位交换数据1.3简介在使用数据库时,通常数据库查询是最重要的功能之一数据库。但是每种查找算法只能应用于特定的数据结构。比如二分查找要求检索到的数据是有序的,而二叉树查找只能适用于二叉查找树,但是数据本身的组织结构并不能完全满足各种数据结构(比如理论上不可能同时对两列进行排序所以,除了数据之外,数据库系统还维护着满足特定搜索算法的数据结构,这些数据结构以某种方式引用(指向)数据,使得高级搜索算法可以在这些数据结构上实现,这个数据结构就是索引,索引一般以文件的形式存储在磁盘上,而索引的检索需要进行磁盘I/O操作,因此,评价一个数据好坏最重要的指标作为索引的结构是搜索过程中磁盘I/O操作次数的渐近复杂度。索引是一种帮助MYSQL高效获取数据的数据结构。索引存储在文件系统中。索引的文件存储形式与存储引擎有关。索引文件的结构:hash、二叉树、B树、B+树2.索引分类2.1hash下面是一个mysql数据文件,有Id和name两列。如果我们以哈希格式(哈希表)存储,只需要计算某列的哈希值,根据数组的长度取模,就可以从0-7n个下标位置得到,所以效率其实是比较高的,但是使用hash表来存储,有一定的缺点:如果使用hash来存储,需要把所有的数据文件都加到内存中,比较消耗内存空间。如果all所有的查询都是等价查询,那么hash确实很快,但是在企业或者实际工作环境中,更多的是在范围内查找数据,而不是等价查询,因为hash不适合,所以在mysql中没有选择Hash存储format2.2二叉树索引格式:对于树来说,有一个更新和落在里面的序列。不要一上来就看结构。首先,您需要了解树的种类。树由一个树根组成,然后有n个多个分支。组成,这些分支是一些树结构。当你有多个树枝(多元素)的时候,这时候查找效率会比较低,所以就有了二叉树。为什么二叉树更容易使用?因为二叉树是有两个分支的,但是如果有两个分支,就会导致一个效果,就是我们每次查找数据的时候,和二叉查找类似,但是二叉树也有不好的地方,可以看到我们上面图中二叉树的索引格式,左边的节点会比较短(只需要读三遍),而右边的节点会长很多(需要读五遍)次),这将导致树的深度更深。树的节点每次Read,都会有一次IO,深度越高,IO越高,会影响我们数据读取的效率,所以也有(平衡二叉树)和(红黑树))平衡二叉树:保持平衡的是左子树和右子树的高度差不能大于1,但是不适合我们上面的格式,因为已经超过1了,但是AVL树也有问题就是调整的次数太频繁了,涉及到一个操作就是旋转,一种左旋,一种右旋。为了保持平衡,需要旋转N次。这种轮换实际上是在浪费时间。每次增删改查都要经过N次轮换。效率太低了。我给你推荐一个网站。可以直接看到AVL树的运行过程。不知道的同学可以去看看。很形象:AVLTrees(Balancedbinarysearchtrees)红黑树:本身也是平衡树,但是中间做了一个trade-off,就是损失了一部分平衡性能,但是保持了相对的平衡。它做了这么一个操作,就是最长子树的高度,只要不超过最短子树的两倍就可以了。同时在红黑树中引入了red和black两种节点信息。有了这些信息,就可以帮助我们做出平衡。在AVL树中,有轮换和维护。平衡,而红黑树有两种旋转和变色来维持平衡。红黑树是一种高级的AVL树。它损失了平衡的一部分性能,但是保持了我们插入和删除数据的效率,虽然损失了一部分性能,但是它仍然是一棵平衡树,既然是平衡树,它最长的子树不多比最短子树的两倍,也就是说如果最短子树是4,那么最长子树就是8,所以在我们查找数据的时候,已经不是二分查找了,效率会变低。无论是二叉树还是红黑树,由于树的深度太深,IO的数量都会增加,影响数据读取的效率。最重要的是,降低IOIO是我们IT行业的一个瓶颈。一个是磁盘IO,一个是网络IO。作为软件开发人员,我们没有办法调整硬件瓶颈。我们只能从程序中减少我们的IO量。我们有两个方向,一个是减少IO的数量,一个是减少IO的数量,从这两个方面来解决。比如我们以前要读取10次数据,现在只需要读取一次,那么IO量就会少10次,原来需要读取1MB的数据,现在只需要读取1KB的数据数据,这也是为什么我们在写mysql查询语句的时候不建议使用select*from,因为这样的查询会查询到N个以上的字段,本来我只需要两个字段,结果给了我30个字段,这样会增加查询量IO,所以我们会考虑是否可以减少索引的个数,所以下面引出了我们的——B-tree2.3B-treeB-tree的特点:所有的key值都分布在整棵树中。搜索可能在非叶节点处结束。在关键字的全集中查找,性能接近于二分查找。每个节点最多有m个子树根节点。至少有2个子树。分支节点至少有m/2个子树(除根节点和叶节点外都是分支节点)。所有叶子节点都在同一层,每个节点最多可以有m-1个key,并且按升序排列B-tree结构的解释:示例图解释:每个节点占用一个磁盘块,并且一个节点有两个按升序排列的关键字和三个指向子树根节点的指针。指针存储子节点所在的磁盘块。地址,两个关键字划分的三个作用域域对应三个指针指针指向的子树数据范围以根节点为列,关键字为16和34。p1指针指向的子树数据范围小于16,数据范围为P2指针指向的子树为16-34,P3指针指向的子树的数据范围大于34。查找关键(28)过程:根据节点找到磁盘块1,读取内存【第一次磁盘I/O操作】比较key28,在区间(16,34)中找到磁盘块1的指针P2,根据P2指针找到磁盘块3,读入内存【第2次磁盘I/O操作】比较关键字28在区间(25,31),找到磁盘块3的指针P2,根据P2指针找到磁盘块8,读取内存,[磁盘I/O操作第3次]在diskblock8的关键字列表中找到关键字28缺点:每个节点都有key,也包含数据,每页存储空间有限。如果数据比较大,每个节点存储的key数量会减少。当存储的数据量很大时,深度也会很大,会增加查询时的磁盘IO次数,从而影响查询性能。2.4B+树B+Tree是在BTree的基础上进行的优化。变化如下:B+Tree的每个节点可以包含更多的节点。有两个原因。第一个原因是减少树的大小。高度,第二个原因是把数据范围改成多个区间。间隔越多,数据检索越快。非叶子节点存放key(1、2、3盘都是存放key),叶子节点存放key和data叶子节点的两个指针是连在一起的(符合预读的特点磁盘)。顺序查询性能更高。如果当前磁盘块下没有其他节点,则为叶节点。否则为非叶节点。结构图:注:一共有两个头指针三个,一个指向根节点,一个指向key最小的叶子节点,所有的叶子节点(也就是数据节点)在一个链环中结构,所以对B+Tree可以进行两种查询操作,一种是范围搜索和对主键的分页搜索,另一种是从根节点开始的随机搜索。3、mysql的存储引擎3.1mysqlinnoDB(直接把数据放在叶子节点)3.1mysqlinnoDB(直接把数据放在叶子节点)存储对应的行记录1.InnoDB通过B+Tree结构为主键创建索引,然后离开如果没有主键,将选择唯一键。如果没有唯一键,则会生成一个6位的row_id作为主键。2.如果创建索引的key是另外一个字段,那么叶子节点会存储该记录的主键,然后通过主键索引找到对应的记录,在name上建立索引,将id存储在name列,然后用id找到对应的key和data3.1mysqlMyISAM下面的0X0022其实就是地址,根据我们的ID显示出来,找到我们的地址,然后用地址找到对应的数据对应表4.索引分类mysql索引有五种类型:主键索引、唯一索引、普通索引、全文索引、组合索引。通过在字段上加索引,可以提高数据读取的速度,提高项目的并发性和抗压性。主键索引:>主键是唯一索引,但必须指定为PRIMARYKEY,且每个表只能有一个主键唯一索引>索引列的所有值只能出现一次,即,必须唯一,可以为空普通索引>基本索引类型,可以为空,没有唯一性限制全文索引>全文索引的索引类型为FULLTEXT,全文index可以对varchar、char、text的列创建组合索引>由多个列值组成的索引,专门用于组合搜索5.mysql存储引擎总结不断,因为项目有问题需要来解决,今天的mysql索引机制就到这里了。
