美文网首页
MySql原理 - 索引

MySql原理 - 索引

作者: 你与时光终会散 | 来源:发表于2020-05-19 15:22 被阅读0次

1.索引

1.1 索引概述

MySQL官方对索引的定义:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)数据,这样就可以再这些数据结构上实现高级查找算法

1.2 索引优势劣势

优势:

  • 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本
  • 通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗

劣势:

  • 索引实际上也是一张表,该表中保存了逐渐与索引字段,并指向实体类的记录,所以索引列也是需要占用空间的
  • 虽然所以大大提高了查询的效率,同时却也降低了更新表的速度
1.3 索引结构

索引是MySQL的存储引擎层中实现的,而不是在服务器层,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类别

四种索引

  • BTREE索引:最常见的索引类型,大部分都支持B树索引
  • HASH索引:至于Memory引擎支持,使用场景简单
  • R-tree(空间索引):空间索引是MyISAM索引的一个特殊索引类型,主要用于地理位置的数据结构,使用较少
  • Full.text(全文索引):全文索引也是MyISAM索引的一个特殊索引类型,InnoDB从MySQL5.6版本开始也支持全文索引

我们平常所说的索引,如果没有特别说明,都是指B+树(多路搜索树,并不一定是二叉树)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用B+tree索引。

1.3.1 BTree结构

BTtee又叫多路平衡搜索树,一颗m叉的BTree特性如下

  • 树中每个节点最多包含m个孩子
  • 除根节点与叶子节点外,每个节点至少有ceil(m/2)个孩子
  • 若根节点不是叶子节点,则至少有两个孩子
  • 所有的叶子节点都在同一层
  • 每个非叶子节点由n个key与n+1个指针组成其中ceil(m/2) + 1 <=n <= m-1

以5叉BTree为例,key的数量:ceil(5/2)-1 <= n <= 5-1,所有2<=n<=4,当n>4时,中间节点分裂到父节点,两边节点分裂

image.png

该BTree与二叉树相比,查询效率更高,因为对于相同的数据量来说,BTree的层级结构比二叉树小,因此搜索速度快。

1.3.2 B+Tree结构

B+Tree为BTree的变种,B+Tree与BTree的区别如下

  • n叉B+Tree最多包含n个key,而BTree最多包含n-1个key
  • B+Tree的叶子节点保存所有的key信息,依key大小顺序排列
  • 所有的非叶子节点都可以看做是key的索引部分
image.png

由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子,所以B+Tree的查询效率更加稳定

1.3.3 MySQL中的B+Tree

MySQL索引数据结构对经典的B+Tree进行了优化,在B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

image.png
1.4 索引的分类
  • 单值索引:一个索引只包含单个列,一个表可以有多个
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 符合索引:一个索引包含多个列
1.5 索引的创建原则
  • 对查询频次较高,数据量比较大的表
  • 索引字段的选择,在where字句条件中
  • 使用唯一索引,区分度越高,索引效率越高
  • 使用短索引
  • 利用最左前缀

相关文章

网友评论

      本文标题:MySql原理 - 索引

      本文链接:https://www.haomeiwen.com/subject/wfrbohtx.html