Mysql原理(二)索引篇

常见的数据结构

1、有序数组:有序的元素序列,同时每一个数组元素都有下标,所以在查询的时候通过下标可以直接获取,但是插入一条数据需要将后面的记录往后移动成本就会高,该数据结构适合存储静态数据更为合适。
2、哈希表:以键值存储数据,当输入key通过hash算法得到对应的value值,如果hash算法得到相同的值,则需要在后面加上链表
。查询的时候先进行hash然后遍历链表值和当前值是否一样。
3、二叉树:每个节点最多两颗子树,左子树和右子树是有序的。平衡二叉树保证左右子树的高度差的绝对值不超过1。在查询插入修改操作时间复杂度都是O(lg(n))。
思考:
1、为什么哈希表不适合做mysql索引?
对于单条数据查询,哈希索引更快时间复杂度O(1),但数据库查询还会存在范围查询(大于、小于、order by、group by等)这时候哈希索引查询的时候时间复杂度则变为O(n).
2、二叉树为什么也不能作为数据库索引?
当数据量大的时候树的高度就会变大,查询的时候会比较慢。当存储的记录时,也会不断查询叶子节点进行很多次磁盘IO操作这是很致命的

B树和B+树

    Mysql建立索引对于整个效率是很重要的,大大提交mysql检索速度。Mysql索引的数据结构大家都知道是B+树,那接下来首先介绍一下B树、B+树。
    树这种数据结构(二叉树、红黑二叉树)都是为了解决系统查询慢的问题。二叉树特点,每个非叶子节点都只有两个孩子节点,当数据量特别大,会导致树的深度很大IO操作也增加,对整个查询并没有起到任何操作。
    B树定义(平衡多叉树) 每个节点可以存储更多的值,降低IO操作

  • 除了根节点每个节点至少有一个关键字
  • 节点的值按照升序排序
  • 每个节点对子树的范围有所分割。节点有个指针指向子树
  • 所有子节点有相同的深度,即树的高度
    Mysql原理(二)索引篇_第1张图片
    B树结构.png

        B+树定义
  • 有k个子节点,必然有K个关键码
  • 非叶节点进具有索引作用,记录信息值均放在叶节点中
  • 树的所有叶节点构造是一个有序链表,按照次序查找能得到全部记录。

Mysql原理(二)索引篇_第2张图片
B+树结构.png

    思考:为什么Mysql选择B+树作为索引的数据结构?
    1、B树多路存储,每次加载B树一个节点然后一步步往下找,每次载入一个节点到内存中
    2、Mysql在查询的时候不止查找一条记录,为了防止B树在进行中序遍历,存在跨层访问。而B+树通过非叶子节点找到数据起始位置后,按照它的非叶子节点是一个有序链表的结构,能够迅速查找到其他的值。B+树循序数据分批次加载,同时树的高度提高了查询效率。当B+树的高度达到4层,其实已经可以存储上千万的数据了。
3、B+树的非叶子节点不存储实际记录,只是存储记录key,在相同的内存下B+树可以存储更多索引,存储实际记录行相对比较紧密适合大数量磁盘储存。

索引分类

  1. 主键索引:为主键创建的索引每个表有且只有一个,如果创建表的时候没有指定Mysql则会选择一个唯一性的字段默认设置为主键索引。Mysql在查询的时候直接搜索主键树就可以返回。
  2. 普通索引:可以创建多个普通索引,但是在Mysql查询的过程中,首先通过普通字段查询普通索引树查询到主键,然后再根据主键搜索主键索引树查找到这条记录。这一个过程称为回表操作。
  3. 唯一索引:不允许字段有重复。比如身份证号码等信息。
  4. 全文索引:用于文章的检索。可以在char、varchar、text等类型字段创建。

注意:
     为了性能和存储空间考虑,我们最好保证主键越小越好。因为普通索引树存储着主键值。这样不仅保证主键树的大小而且保证普通索引的大小。
     B+树占用磁盘空间,如果整个树很大数据页满了B+树会申请新的数据页,挪动一部分数据过去这个过程称为页分裂,当数据删除的时候也会存在页合并过程。整个性能也降低,
     综上所述从性能和存储空间考虑自增主键更加合理。

覆盖索引:
    执行一条查询语句,查询的结果正好在普通索引树上,可以直接提供查询结果不需要进行回表。覆盖索引可以减少树的搜索次数,显著提升查询性能,是常用的优化手段。
最左前缀原则:
    B+树这种索引结构,利用索引的"最左前缀"来定位记录,索引项按照索引定义里出现字段顺序排序的。当建立联合索引的时候,我们就得考虑索引的复用能力。当索引为(a,b)如果查询条件只有b字段,则不走索引。

你可能感兴趣的:(Mysql原理(二)索引篇)