0

0

Mysql简易索引方案分析

WBOY

WBOY

发布时间:2023-05-29 13:16:44

|

1216人浏览过

|

来源于亿速云

转载

    Mysql简易索引

    一、没有索引的时候如何查找

    先忽略掉索引这个概念,如果现在直接要查某条记录,要如何查找呢?

    在一个页中查找

    如果表中的记录很少,一个页就够放,那么这时候有 2 种情况:

    • 用主键为搜索条件:这时就是之前文章提过的方式,页面目录中用二分法快速定位到槽,然后遍历该槽对应分组的记录,最终找到指定记录。

    • 用其他非主键的列为搜索条件:因为数据页中没有为非主键列建立页目录,无法通过二分法快速定位槽,只能从 Infimum 记录开始一次遍历单链表的每条记录,效率低下。

    在很多页中查找

    当表中的记录非常多,就会用到很多的数据页来存储,这时候需要 2 个步骤:

    • 定位到记录所在页。

    • 重复上述在一个页中查找的过程。

    总得来说,当没有索引,我们无法快速定位到记录所在页,只能从第一页沿着双向链表(页有前一页和后一页)一直找下去,然后在每一页中重复上述的过程查询指定的记录,需要遍历所有记录,这种方式非常耗时。

    二、一个简易索引

    既然是因为页数太多导致定位记录太慢,那如何解决呢?不妨参考一下“页目录”。

    页目录就是为了根据主键快速定位一条记录在页中的位置而设置的。因此,我们可以探讨一种方法,即创建一个“其他目录”来快速定位记录所在的页面。

    但是这个“别的目录”要想完成还得干好 2 件事。

    1. 下一页用户记录的主键值必须大于上一页的

    假设,每个数据页最多可以放 3 条记录(实际上可以放很多),那么现在向表里插入 3 条记录,每条记录有3个列 c1、c2、c3。为了看着方便,存储行格式也简化下,只留关键属性。虚拟记录Infimum和Supremum分别位于用户记录的首尾,中间有3条用户记录。

    Mysql简易索引方案分析

    此时,继续插入 1 条记录。在假设的情况下,需要至少分配一个新页面,因此这两个页面将被重新分配并重新排列。

    Mysql简易索引方案分析

    请注意红色字体显示的两条记录,其中包括了一个新插入的主键为 4 的记录,应该被放在新页上。但是,为了满足下一页用户记录的主键值必须大于上一页的用户记录主键值,做了诸如记录移动的操作,这个过程也可以称为“页分裂”。

    另外,为什么新页是页 28,而不是 11?因为页在磁盘上可能并不挨着,它们只是通过维护上一页和下一页的编号而建立了链表关系。

    2. 给所有的页建立一个目录项

    现在继续向表里增加数据,最终多个页的关系是这样:

    Mysql简易索引方案分析

    为了从多个不相邻的页面快速定位某个记录,需要为它们编制一个目录,因为这些页面在磁盘上可能不是连续的。

    magento(麦进斗)
    magento(麦进斗)

    Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

    下载

    每个页对应一个目录项,每个目录项包括:

    • 页的用户记录中最小的主键值,用 key 来表示

    • 页号,用 page_no 表示

    所以,给它们编好目录之后就是这样的关系:

    Mysql简易索引方案分析

    那么,现在我想查找主键值为 20 的记录,具体就分两步走:

    利用二分法从目录项中快速确定主键值为 20 的记录在目录项 3,并且它所在的页码为 9。知道是在页 9,重复之前的方式,找到最终目标记录。

    到此,一个简易的方案完成。而完成的这个简易目录,它有个别名,叫做索引。

    三、简易索引暴露出的问题

    上述的简易索引是原书作者为了循序渐进的帮助读者理解而设置的内容,这并不是innodb的索引方案。

    那么针对上述的建议索引,看下有哪些问题。

    问题一:

    InnoDB 使用页作为管理存储空间的基本单位,也就是最多只能保存16kb的连续存储。

    当表中记录越来越多,此时就需要非常大的连续存储空间才可以把所有的目录项都装下,这对大数据量的表来说不现实。

    问题二:

    我们经常还要对记录执行增删改操作,会牵一发而动全身。

    比如,上图中我如果把页 28 中的记录都删除,那么页 28 就没必要存在,进而目录项 2 也没必要存在。这时候就需要把目录项 2 后的目录项都向前移动一下。

    就算不移动,把目录项 2 作为冗余放在目录项列表中,仍然会浪费很多的存储空间。

    相关专题

    更多
    Java JVM 原理与性能调优实战
    Java JVM 原理与性能调优实战

    本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

    13

    2026.01.20

    PS使用蒙版相关教程
    PS使用蒙版相关教程

    本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

    60

    2026.01.19

    java用途介绍
    java用途介绍

    本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

    84

    2026.01.19

    java输出数组相关教程
    java输出数组相关教程

    本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

    39

    2026.01.19

    java接口相关教程
    java接口相关教程

    本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

    10

    2026.01.19

    xml格式相关教程
    xml格式相关教程

    本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

    13

    2026.01.19

    PHP WebSocket 实时通信开发
    PHP WebSocket 实时通信开发

    本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

    17

    2026.01.19

    微信聊天记录删除恢复导出教程汇总
    微信聊天记录删除恢复导出教程汇总

    本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

    157

    2026.01.18

    高德地图升级方法汇总
    高德地图升级方法汇总

    本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

    163

    2026.01.16

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    MySQL 教程
    MySQL 教程

    共48课时 | 1.8万人学习

    MySQL 初学入门(mosh老师)
    MySQL 初学入门(mosh老师)

    共3课时 | 0.3万人学习

    简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信

    共1课时 | 804人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号