关于MYSQL中B+树索引存储和查找

来源:6-1 Spring配置文件要小心“一步到位”

七十亿分之一_

2020-09-10

在网上绝大多数文章对于MYSQL中InnoDB引擎中主键索引存储的示例图和讲解举的例子都是有顺序的主键,所以整体在对某个主键进行查询的时候,基本遵循左边小,右边大去搜索的,如果在非叶子节点内部,也会使用二分查找来定位待查找主键的位置。
我的问题是:
1.如果我的主键是UUID这种没有规律的字符串,那在B+树上是怎么决定哪些字符串在左边的子树或者右边子树的?
2.在非叶子节点内部,由于是无规律字符串无法使用二分查找,那么MYSQL又是如何进行查找的?

写回答

1回答

张勤一

2020-09-10

七十亿兄你好:

    首先来说,UUID 或者其他的不具有业务含义的字符串作为 MySQL 的主键肯定是不合适的,这会严重降低 MySQL 的性能(具体原因我不再解释了,视频课程中和网络上的博客、文章应该也是有很多介绍讲解的)。

    那么,如果就是用 UUID 作为主键会出现怎样的效果呢?也就是你这里的两个问题应该怎么回答呢?其实核心还是不管是主键索引(也叫做聚簇索引)还是其他的某一列、某几列构成的联合索引,其索引的构造是完全一致的(否则,有多套索引排序规则,也是难以维护而且难以理解的)。针对于 InnoDB 而言:

    1. 排序规则会按照字符串的顺序去做排序(其他的列索引也是一样的,想一想,你会给字符串的列加上索引),但是,需要注意,它不会导致包含数据的页面被重写。如果页面上有空间,那么它将被放置在该页面中。将重新格式化单个页面,以将行放在页面中的正确位置;当页面已满时,将发生页面拆分,页面上的一半行转到一页,另一半转到另一页,然后将页面重新链接到包含具有聚簇索引的表数据的页面的链接列表中;

    2. 叶子节点内部并不是无规律的字符串,它是按照字符串的顺序排列的,二分查找仍然可以作用于字符串的查找(其实,只要你设定好了比较算法,二分查找对于任何数据类型都可以生效,无非就是按照你的比较规则查询就可以了)


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

1
1
七十亿分之一_
牛逼,牛逼,非常感谢一哥的回答,很专业
2020-09-10
共1条回复

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

452 学习 · 204 问题

查看课程