InnoDB原理篇:为什么使用索引会变快?
索引
假设给你一本非常厚的《Java编程思想》阅读,没有目录,你想快速找到某一个章节的知识点,那估计得找一会了,如果有目录就不一样。
索引其实就是为了提高数据查询的效率,就像书的目录一样,对于数据库的表而言,索引其实就是它的目录。
二叉搜索树
索引的实现种类繁多,比如常见的有序数组、哈希表、树等,不同的结构都有自己的适用场景和局限性,在数据库领域中,树结构是被广泛使用。
我们先从最基本的二叉搜索树说起。
二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值,如下图所示
如果要查id=4
的数据,按照图中的搜索顺序是索引页A -> 索引页B -> 索引页D -> 数据页0
,时间复杂度是O(log(N))
。
也就是说,搜索速度与高度有关,树越高,性能越差,假设100
万行的表,使用二叉树来存储,树高20
,磁盘每次随机读一个数据块需要10ms
左右,单独访问一个行可能需要20
个10ms
的时间,这个查询可真够慢的。
N叉搜索树
为了减少磁盘随机读IO
,就必须控制好树的高度,那就不应该使用二叉树,而是使用N叉树,这里的N
代表数据块的大小。
也就说,你一个索引页存储的数据越多,树会越矮,InnoDB
中就使用了B+树来实现索引。
以InnoDB
的整数字段建立索引为例。
一个页默认16kb
,整数(bigint
)字段的长度为8B
,另外还跟着6B
的指向其子树的指针,这意味着一个索引页可以存储接近1200
条数据(16kb/14B ≈ 1170
)。
如果这颗B+树高度为4
,就可以存1200
的3
次方的值,差不多17
亿条数据。
考虑到树根节点总是在内存中的,树的第二层很大概率也在内存中,所以一次搜索最多只需要访问2
次磁盘IO
。
可能小伙伴会有疑问,为什么树的根节点与树的第二层会在内存,第三层、第四层却没在?
道理很简单,看下数据大小就清楚了
树的根节点就是
16kb
的索引页,内存完全可以放下,里面存储1200
条索引目录树的第二层总共是
1200
个索引页,1200 * 16KB = 20M
内存依然放得下的树的第三层
1200 * 1200 = 144w
页,144w * 16kB = 23G
放内存就不合适了树的第四层就是数据页了,属于完整数据了,更不可能全部加载进内存了
最后再感受下索引搜索的流程。
假设1
亿数据量的表,根据主键id
建立了B+
树索引,现在搜索id=2699
的数据,流程如下
内存中直接获取树根索引页,对树根索引页内的目录进行二分查找,定位到第二层的索引页
内存中直接获取第二层的索引页,对索引页内的目录进行二分查找,定位到第三层的索引页
从磁盘加载第三层的索引页到内存中,对索引页内的目录进行二分查找,定位到第四层数据页
从磁盘加载第四层的数据页到内存中,数据页变成缓存页,对缓存页中的目录进行二分查找,定位到具体的行数据
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
InnoDB原理篇:为什么使用索引会变快?相关推荐
- InnoDB原理篇:Change Buffer是如何提升索引性能的?
前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能. 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起. Change Bu ...
- InnoDB原理篇:如何用好索引
InnoDB中索引分类 我们都知道InnoDB索引结构是B+树组织的,但是根据数据存储形式不同可以分为两类,分别是聚簇索引与二级索引. ps:有些同学还听过非聚簇索引和辅助索引,其他它们都是一个意思, ...
- InnoDB原理篇:聊聊数据页变成索引这件事
前言 每个缓存页对应一个数据页,今天以数据页为起点,来聊聊InnoDB的索引. 数据页 我们都知道平时执行crud的时候,都会从磁盘上加载数据页到Buffer Pool的缓存页里去,更新缓存页后,由异 ...
- mysql innodb myisam 插入数据_mysql innodb换成myisam后插入数据变快?
myisam没有事务支持,它的连续的插入和查询速度都比Innodb快很多,但是如果需要插入和查询穿插着来,那么myisam是表锁,innodb是行锁,innodb的并发性好,并且innodb是支持事务 ...
- 玩转Mysql系列 - 第22篇:mysql索引原理详解
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...
- 超详细图解!【MySQL进阶篇】MySQL索引原理
索引类型 索引可以提升查询速度,会影响where查询,以及order by排序.MySQL索引类型如下: 从索引存储结构划分:B Tree索引.Hash索引.FULLTEXT全文索引.R Tree索引 ...
- Mysql原理篇之表空间---05
Mysql原理篇之表空间---05 前言 回顾 页面类型 页面通用部分 独立表空间结构 区(extent)的概念 段(segment)的概念 区的分类 整理 XDES Entry链表 链表基节点 链表 ...
- 为什么用了索引之后,查询就会变快?
来自:会点代码的大叔 =致力于用大白话讲解复杂的技术= 本期问题 QUESTION 为什么用了索引之后,查询就会变快? 相信很多程序员朋友对数据的索引并不陌生,最常见的索引是 B+ Tree 索引,索 ...
- 为什么索引可以让查询变快,你有思考过吗?
作者 | topEngineerray 来源 | https://blog.csdn.net/topdeveloperr/article/details/88742503 概述 人类存储信息的发展历程 ...
最新文章
- nodejs文件上传报错总结
- 第十八课.支持向量机
- 大数据应用之双色球算奖平台总体设计大纲篇一
- 糟糕!HttpClient 连接池设置引发的一次雪崩!
- literature review and methodology
- jQuery动画的显示与隐藏效果!
- springdata jpa单表操作crud
- (转)Web Services使用多态(XmlInclude) ,支持自定义类型
- idea java no sdk_java - intelliJ IDEA 13错误:请选择Android SDK
- IBM走鹃险胜Cray Jaguar 连任世界最快超级计算机
- 如何搭建大数据分析平台
- C语言 线程 进程 优先级,C++线程优先级SetThreadPriority的使用实例
- 安全加密邮箱哪个好?
- dxo photolab mac 破解版永久激活方法
- asp.net打开新标签页
- 我不喜欢代码,却为何坚持做程序员(二)
- 关于视觉工业相机的50个问题
- 中国近现代史纲要重点整理
- 在大学里要作的20件事
- Firefox的模仿MyIE插件套餐
热门文章
- WEB安全基础-PHP+MySQL实践
- WEB安全基础-SQL相关
- python字典文件,python-文件转字典,字典转文件
- 翻领成型器轨迹点MATLAB编程,基于MATLAB的翻领成型器领口曲线的展开及可视化
- 计算机等级考试java题型_计算机等级考试报考建议
- mysql 表.t_mysql ---表的操作
- python滚动条自动向下,python tqdm 如何使得滚动条不上下滚动(保持一行内滚动)
- jquery 给类名元素添加行内样式_学Jquery的第一天
- java 好和不好的形容词 英语怎么说_java必会的英语单词
- (软件工程复习核心重点)第十二章软件项目管理习题