【问题标题】:How does MYSQL finds the key inside particular index page?MYSQL 如何在特定索引页中找到键?
【发布时间】:2021-12-26 12:01:13
【问题描述】:

据我了解,MySQL 将聚集索引存储在其自定义的树状数据结构中(类似于 B+-树)。

这棵树的节点称为“页面”,可能包含大量键。假设是 100。假设我们正在寻找密钥 K1。使用树我们可以找到页面 P1,其中包含键 K1 或指向该页面的指针以进一步查看。

但是 MYSQL 是如何找到要在同一页面中查找的键或适当的指针的呢?页面内的键是否存储在数组中,MYSQL 使用二进制搜索还是它们存储在某个本地树中还是只是对页面内所有键的线性扫描?

【问题讨论】:

    标签: mysql indexing innodb clustered-index


    【解决方案1】:

    是的,MySQL 在页面内使用二进制搜索,请参阅the documentation

    页面目录

    页面的页面目录部分具有可变数量的记录指针。有时记录指针被称为“槽”或“目录槽”。与其他 DBMS 不同,InnoDB 没有为页面中的每条记录设置一个槽。相反,它保留了一个稀疏目录。在完整的页面中,每 6 条记录将有一个插槽。

    槽跟踪记录的逻辑顺序(键顺序而不是堆上的放置顺序)。因此,如果记录是 'A''B''F''D',则插槽将是 (pointer to 'A') (pointer to 'B') (pointer to 'D') (pointer to 'F') .因为slots是key order,并且每个slots都有固定的大小,很容易通过slots对页面上的记录进行二分查找。

    由于页面目录没有为每条记录设置一个槽,二分查找只能给出一个粗略的位置,然后 InnoDB 必须遵循“下一个”记录指针。

    【讨论】:

    • 感谢您的回答。如果您能解释“每六条记录一个插槽”是什么意思,我将不胜感激?一个空槽,为页面的进一步填充保留一个位置还是什么?
    • “Slot”只是记录指针的另一种说法,并不代表空记录。页面包含实际的记录(数据)和页面目录(指向这些记录的指针列表/数组(=槽),这里是二进制搜索发生的地方)。 MySQL 做出设计决定,这些指针 (=slots) 可以指向最多 6 条记录的列表(其中一些可以为空),而不仅仅是一条记录。因此,如果您有一整页/没有空记录,则所有记录指针/插槽都指向 6 条记录,因此每 6 条记录一个插槽。
    • @Solarflare - 插入或删除会发生什么?它是指向 7 或 5 条记录的插槽吗?事情会在某个时候得到清理吗?
    • @RickJames 是的,如果插槽低于或高于阈值,则会重新平衡。每个槽的记录数是4(第一个和最后一个槽除外)到8,所以文档中提到的“6”似乎是每个槽的平均记录数,而不是最大值。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多