mysql 数据区某个列的行的数量和索引区的节点如果一样, 是否扫描数据区和索引区是一样的效率 ?

发布于 2022-09-11 17:48:33 字数 312 浏览 21 评论 0

图片描述

图片描述
b-tree 结构

如果name字段是索引 , 那么如果表中有7条数据 , b-tree所有节点也是7条数据 , 这样一来 , 扫描整个数据区 和 扫描整个索引区 效率不是差不多吗 ? (但是我记得有人说即使扫描整个索引区也比扫描整个数据区好)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

病女 2022-09-18 17:48:33

列的数量和索引的数量一样, 扫描索引的速度和全表扫的速度?

划一舟意中人 2022-09-18 17:48:33

这个问题回答起来感觉有些困难,其一是 MyISAM 和 InnoDB 用的是 B+Tree,不是 B-Tree,所以题图不太正确;其二是没有说明 name 是主键索引还是普通索引,如果是普通索引,无论是 MyISAM 还是 InnoDB,都是扫描索引性能较好。

现在我们约束一下条件,假设 name 是主键,对比扫描全部索引和全部数据的区别,且假定所有数据不在内存中。

MyISAM

MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址,也就是说,索引和数据是分开的。

因此,扫描整个索引区比数据区性能好

InnoDB

InnoDB 的数据文件本身就是索引文件。在 InnoDB 中,表数据文件本身就是按 B+Tree 组织的一个索引结构,这棵树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,InnoDB 表数据文件本身就是主索引。

因此,扫描整个索引区和数据区是一样的

这篇文章确实不错 MySQL索引背后的数据结构及算法原理

幻想少年梦 2022-09-18 17:48:33

你的意思大概应该是如果列的数量和索引的数量一样, 扫描索引的速度和全表扫的速度一样.

但是, 是绝对不一样的.

简单的讲解释, 索引是个树形结构, 每个节点内的数据是有序的, 同一层的节点是有序的, 整个数据结构都有很强的有序性, 所以它不需要遍历完所有的索引节点就能找到数据, 或者确定没有目标数据.

有序性加速查找速度, 这个你可以类比二分查找, 二分查找的数据是有序的, 它不需要遍历数组中所有的节点, 就可以定位到目标数据.

如果对Mysql索引的原理有兴趣的话, 你可以看:MySQL索引背后的数据结构及算法原理

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文