美文网首页
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