索引

假设给你一本非常厚的《Java编程思想》阅读,没有目录,你想快速找到某一个章节的知识点,那估计得找一会了,如果有目录就不一样。

索引其实就是为了提高数据查询的效率,就像书的目录一样,对于数据库的表而言,索引其实就是它的目录

二叉搜索树

索引的实现种类繁多,比如常见的有序数组、哈希表、树等,不同的结构都有自己的适用场景和局限性,在数据库领域中,树结构是被广泛使用。

我们先从最基本的二叉搜索树说起。

二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值,如下图所示

如果要查id=4的数据,按照图中的搜索顺序是索引页A -> 索引页B -> 索引页D -> 数据页0,时间复杂度是O(log(N))

也就是说,搜索速度与高度有关,树越高,性能越差,假设100万行的表,使用二叉树来存储,树高20,磁盘每次随机读一个数据块需要10ms左右,单独访问一个行可能需要2010ms的时间,这个查询可真够慢的。

N叉搜索树

为了减少磁盘随机读IO,就必须控制好树的高度,那就不应该使用二叉树,而是使用N叉树,这里的N代表数据块的大小。

也就说,你一个索引页存储的数据越多,树会越矮,InnoDB中就使用了B+树来实现索引。

InnoDB的整数字段建立索引为例。

一个页默认16kb,整数(bigint)字段的长度为8B,另外还跟着6B的指向其子树的指针,这意味着一个索引页可以存储接近1200条数据(16kb/14B ≈ 1170)。

如果这颗B+树高度为4,就可以存12003次方的值,差不多17亿条数据。

考虑到树根节点总是在内存中的,树的第二层很大概率也在内存中,所以一次搜索最多只需要访问2次磁盘IO

可能小伙伴会有疑问,为什么树的根节点与树的第二层会在内存,第三层、第四层却没在?

道理很简单,看下数据大小就清楚了

  • 树的根节点就是16kb的索引页,内存完全可以放下,里面存储1200条索引目录

  • 树的第二层总共是1200个索引页,1200 * 16KB = 20M内存依然放得下的

  • 树的第三层1200 * 1200 = 144w页,144w * 16kB = 23G放内存就不合适了

  • 树的第四层就是数据页了,属于完整数据了,更不可能全部加载进内存了

最后再感受下索引搜索的流程。

假设1亿数据量的表,根据主键id建立了B+树索引,现在搜索id=2699的数据,流程如下

  • 内存中直接获取树根索引页,对树根索引页内的目录进行二分查找,定位到第二层的索引页

  • 内存中直接获取第二层的索引页,对索引页内的目录进行二分查找,定位到第三层的索引页

  • 从磁盘加载第三层的索引页到内存中,对索引页内的目录进行二分查找,定位到第四层数据页

  • 从磁盘加载第四层的数据页到内存中,数据页变成缓存页,对缓存页中的目录进行二分查找,定位到具体的行数据

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

InnoDB原理篇:为什么使用索引会变快?相关推荐

  1. InnoDB原理篇:Change Buffer是如何提升索引性能的?

    前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能. 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起.   Change Bu ...

  2. InnoDB原理篇:如何用好索引

    InnoDB中索引分类 我们都知道InnoDB索引结构是B+树组织的,但是根据数据存储形式不同可以分为两类,分别是聚簇索引与二级索引. ps:有些同学还听过非聚簇索引和辅助索引,其他它们都是一个意思, ...

  3. InnoDB原理篇:聊聊数据页变成索引这件事

    前言 每个缓存页对应一个数据页,今天以数据页为起点,来聊聊InnoDB的索引. 数据页 我们都知道平时执行crud的时候,都会从磁盘上加载数据页到Buffer Pool的缓存页里去,更新缓存页后,由异 ...

  4. mysql innodb myisam 插入数据_mysql innodb换成myisam后插入数据变快?

    myisam没有事务支持,它的连续的插入和查询速度都比Innodb快很多,但是如果需要插入和查询穿插着来,那么myisam是表锁,innodb是行锁,innodb的并发性好,并且innodb是支持事务 ...

  5. 玩转Mysql系列 - 第22篇:mysql索引原理详解

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...

  6. 超详细图解!【MySQL进阶篇】MySQL索引原理

    索引类型 索引可以提升查询速度,会影响where查询,以及order by排序.MySQL索引类型如下: 从索引存储结构划分:B Tree索引.Hash索引.FULLTEXT全文索引.R Tree索引 ...

  7. Mysql原理篇之表空间---05

    Mysql原理篇之表空间---05 前言 回顾 页面类型 页面通用部分 独立表空间结构 区(extent)的概念 段(segment)的概念 区的分类 整理 XDES Entry链表 链表基节点 链表 ...

  8. 为什么用了索引之后,查询就会变快?

    来自:会点代码的大叔 =致力于用大白话讲解复杂的技术= 本期问题 QUESTION 为什么用了索引之后,查询就会变快? 相信很多程序员朋友对数据的索引并不陌生,最常见的索引是 B+ Tree 索引,索 ...

  9. 为什么索引可以让查询变快,你有思考过吗?

    作者 | topEngineerray 来源 | https://blog.csdn.net/topdeveloperr/article/details/88742503 概述 人类存储信息的发展历程 ...

最新文章

  1. nodejs文件上传报错总结
  2. 第十八课.支持向量机
  3. 大数据应用之双色球算奖平台总体设计大纲篇一
  4. 糟糕!HttpClient 连接池设置引发的一次雪崩!
  5. literature review and methodology
  6. jQuery动画的显示与隐藏效果!
  7. springdata jpa单表操作crud
  8. (转)Web Services使用多态(XmlInclude) ,支持自定义类型
  9. idea java no sdk_java - intelliJ IDEA 13错误:请选择Android SDK
  10. IBM走鹃险胜Cray Jaguar 连任世界最快超级计算机
  11. 如何搭建大数据分析平台
  12. C语言 线程 进程 优先级,C++线程优先级SetThreadPriority的使用实例
  13. 安全加密邮箱哪个好?
  14. dxo photolab mac 破解版永久激活方法
  15. asp.net打开新标签页
  16. 我不喜欢代码,却为何坚持做程序员(二)
  17. 关于视觉工业相机的50个问题
  18. 中国近现代史纲要重点整理
  19. 在大学里要作的20件事
  20. Firefox的模仿MyIE插件套餐

热门文章

  1. WEB安全基础-PHP+MySQL实践
  2. WEB安全基础-SQL相关
  3. python字典文件,python-文件转字典,字典转文件
  4. 翻领成型器轨迹点MATLAB编程,基于MATLAB的翻领成型器领口曲线的展开及可视化
  5. 计算机等级考试java题型_计算机等级考试报考建议
  6. mysql 表.t_mysql ---表的操作
  7. python滚动条自动向下,python tqdm 如何使得滚动条不上下滚动(保持一行内滚动)
  8. jquery 给类名元素添加行内样式_学Jquery的第一天
  9. java 好和不好的形容词 英语怎么说_java必会的英语单词
  10. (软件工程复习核心重点)第十二章软件项目管理习题