索引再梳理

1 常见的索引类型

HASH
顺序表
B树
B+树
红黑树
跳表

  • 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。

  • 有序数组在等值查询和范围查询场景中的性能就都非常优秀,查询的话,使用二分查找,时间复杂度是O(log(N)),如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。

  • 所以,有序数组索引只适用于静态存储引擎,比如你要保存的是 2017 年某个城市的所有人口信息,这类不会再修改的数据。

  • B树也是课本里的经典数据结构了。B 树又叫平衡多路查找树。一棵m阶的B 树的特性如下:
    1) 每个节点包含m棵子树
    2) 除根结点和叶子结点外,其它每个结点至少有ceil(m / 2)个孩子,其中,ceil为向上取整的函数。
    3) 若根结点不是叶子结点,则至少有2个孩子
    4) 所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null);

  • B+ 树一种B-tree的变形树,一棵m阶的B+树和m阶的B树的异同点在于:
    1)有n棵子树的结点中含有n-1 个关键字;
    2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)
    3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)
    所以B+树相对于B树的优势在于:
    1)B+tree的磁盘读写代价更低
    2)B+tree的查询效率更加稳定
    3)B+tree只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(最重要的区别)

  • 红黑树 : 红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一倍;具体来说,红黑树是满足如下条件的二叉查找树(binary search tree):
    1)每个节点要么是红色,要么是黑色。
    2)根节点必须是黑色
    3)红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
    4)对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。
    上述条件是红黑树实现渐进平衡的一种有效标志,只要满足上述条件就可以实现
    渐进平衡。
    红黑树经常用于文件系统中,用作文件的索引。

  • 跳表 结构如下图
    在这里插入图片描述
    可总结为,跳表是在链表的基础上的一种多层链表结构,其中上层链表中的元素是下层链表关键元素,可参考http://blog.jobbole.com/111731/。
    跳表的时空复杂度:
    空间复杂度: O(n) (期望)
    跳跃表高度: O(log n) (期望)
    相关操作的时间复杂度:
    查找: O(log n) (期望)
    插入: O(log n) (期望)
    删除: O(log n) (期望)
    redis 使用跳表作为索引存储结构,可以有效提高效率。

2 InnoDB 的索引模型

innoDB 采用的索引结构是B+树。每一个索引在 InnoDB 里面对应一棵 B+ 树。
主键索引采用的聚簇索引,非主键索引采用的是非聚簇索引。聚簇索引表示叶子节点存的是整行数据,而非聚簇索引表示叶子节点内容是主键的值;

主键索引和普通索引的区别是什么呢?
主键索引只需查询主键的B+树,而非主键索引,如果是非覆盖索引的话,需要回表查询。

索引维护:
1 在索引增加和删除的过程中,会产生页分裂和页合并,这会严重影响效率,所以,一般主键索引都需要设置自增,避免产生不必要的页分裂和页合并。

3 InnoDB使用索引优化数据查询

1 查询语句应该尽可能使用覆盖索引。因为这可以有效避免回表,提高表的查询效率。
2 可以利用索引的“最左前缀”,来定位记录。
3 如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
4 因为存在索引下推,所以在复合索引的二级索引和三级索引上,mysql也会进行判断,进而避免回表后的数据比对。我们应该考虑innodb这个特性,考虑进行二级索引和更多级索引的设置。

4 总结

本文先大体总结了主流的几种索引方式,而后又介绍了innodb的使用索引的方式,最后给出依据索引优化查询的几种措施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值