【MySQL】B+树索引——InnoDB 中的索引方案;MylSAM 中的索引方案 和 InnoDB 中的索引方案 对比

news2024/11/28 12:47:32

一、InnoDB 中的索引方案

1. 聚簇索引

聚簇索引 有两个特点:

  1. 使用记录主键值的大小进行记录和页的排序,这包括3方面的含义.

    (1)页〈包括叶子节点和内节点〉内的记录按照主键的大小顺序排成一个单向链表,页内的记录被划分成若干个组,每个组中主键值最大的记录在页内的偏移量会被当作槽依次存放在页目录中(当然 Supremum 录比任何用户记录都大) ,我们可以在页目录中通过二分法快速定位到主键列等于某个值的记录。
    (2)各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
    (3)存放目录项记录页分为不同的层级, 在同一层级中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。

  2. B+ 树的叶子节点存储的是完整的用户记录。
    所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。

我们把具有这两个特点的 B+ 树称为聚簇索引,所有完整的用户记录都存放在这个聚簇索引的叶子节点处。这种聚簇索引并不需要我们在 SQL 语句中显式地使用 INDEX 语句去创建(后边会介绍索引相关的语句),InnoDB 存储引擎会自动为我们创建聚簇索引。另外有趣的一点是,在 InnoDB 存储引擎中,聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子节点) ,也就是所谓的"索引即数据,数据即索引"。

2. 二级索引

1) 二级索引(或,辅助索引)

以非主键列的大小为排序规则而建立的B+树需要执行回表操作才可以定位到完整的用户记录,这种 B+ 树也称为二级索引 (Secondary Index) 或辅助索引。

2)索引列

由于我们是c2 列的大小作为 B+ 树的排序规则,所以我们也称这棵 B+ 树为 c2 列建立的索引,把 c2列称为索引列。

3)回表

  1. 回表:通过携带主键信息聚簇索引中 重新定位完整的用户记录的过程。

  2. 为什么还需要一次回表操作呢?直接把完整的用户记录放到叶子节点不就好了么?你说得对,如果把完整的用户记录放到叶子节点是可以不用回表,但是太占地方了 一相当于每建立一棵B+树都需要把所有的用户记录复制一遍,这就太浪费存储空间了。

  3. 应用: 以非主键列的大小为排序规则而建立的 B+ 树需要执行回表操作才可以定位到完整的用户记录。

4)二级索引、聚簇索引 异同

二级索引记录和聚簇索引记录使用的是一样的记录行格式,只不过二级索引记录存储的列不像聚簇索引记录那么完整。
聚簇索引或者二级索引的叶子节点中的记为用户记录。为了区分,

  • 聚簇索引叶子节点中的记录称为完整的用户记录
    •  完整的用户记录:指这个记录中存储了所有列的值(包括隐藏列)。
      
  • 二级索引叶子节点中的记录称为不完整的用户记录

3. 联合索引

以c2列和c3列的大小为排序规则建立的 B+ 树称为联合索引,也称为复合索引或多列索引。它本质上也是一个二级索引,它的索引列包括 c2、c3。

注意:“以c2和c3列的大小为排序规则建立联合索引” 和 "分别为c2和c3列建立索引” 的表述是不同的,不同点如下.

  • 建立联合索引只会建立如图 6-15 所示的一棵 B+ 树.
  • 为c2和c3列分别建立索引时,则会分别以 c2 和 c3 列的大小为排序规则建立两棵 B+ 树.
    在这里插入图片描述

4. InnoDB 中 B+ 树索引的注意事项

1) 根页面万年不动窝

一个 B+ 树索引的根节点自创建之日起便不会再移动(也就是页号不再改变)。

2) 内节点中目录项记录的唯一性

二级索引的内节点的目录项记录的内容实际上是由三部分构成的:

 - 索引列的值 
 - 主键值
 - 页号。

	对于二级索引记录来说,是先按照二级索引列的值进行排序,
	在二级索引列值相同的情况下,再按照主键值进行排序。

3)一个页面至少容纳2条记录

为了避免 B+ 树的层级增长得过高。

二、MylSAM 中的索引方案 和 InnoDB 中的索引方案 对比

1) 结构

  • lnnoDB 中索引即数据,也就是聚簇索引的那棵 B+ 树的叶子节点中已经包含了
    所有完整的用户记录。
  • MyISAM 中"索引是索引,数据是数据”。 MyISAM 索引方案虽然也使用树形结构,但是却将索引和数据分开存储。
    • 表中的记录按照记录的插入顺序单独存储在一个文件中(称之为数据文件)。这个文件并不划分为若干个数据页 ,有多少记录就往这个文件中塞多少记录。这样一来,我们可以通过行号快速访问到一条记录。
    • 使用 MyISAM 存储引擎的表会把索引信息单独存储到另外一个文件(称为索引文件)。 MyISAM 会为表的主键单独创建一个索引,只不过在索引的叶子节点中存储的不是完整的用户记录,而是主键值与行号的组合。也就是先通过索引找到对应的行号再通过行号去找对应的记录。

2) 查询方式

  • 在 InnoDB 存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录。
  • 而在 MyISAM 中却需要进行一次回表操作,这也意味着 MyISAM 中建立的索引相当于全部都是二级索引。
    • 如果有必要,我们也可以为其他列分别建立索引或者建立联合索引,其原理与lnnoDB中的索引差不多,只不过在叶子节点处存储的是相应的列+行号。这些索引也全部都是二级索引。
    • MyISAM 的行格式有定长记录格式 (Static)、变长记录格式 (Dynamic) 压缩记录格式( Compressed )等。
      • 定长记录格式,指记录占用的存储空间是固定的。这样就可以使用行号轻松算出某条记录在数据文件中的地址偏移量了。
      • 变长记录格式, MyISAM 直接在索引叶子节点处存储该条记录在数据文件中的地址偏移量。此可以看出, MyISAM 的回表操作是十分快速的,因为它是拿着地址偏移量直接到文件中取数据,而InnoDB 是通过获取主键之后再去聚簇索引中找记录,虽然说也不慢,但还是比不上直接用地址去访问。

——仅做笔记,总结摘抄自《MySQL是怎样运行的》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB 介绍和基本操作

一、MongoDB数据库 1、MongoDB是一种非关系型数据库,是用C语言编写的。其特点是高性能、易部署、易使用,存储数据方便。 2、MongoDB特点: 面向集合存储,易于存储对象类型数据;支持动态查询,支持完全索引&…

灌区量测水系统

1)灌区量测水 灌区量测水是水资源管理的基础,是推进节水农业和水价改革的重要手段。常规在主要水闸处,监测闸前和闸后水位及闸门开启状态(闸位),通过实时监测数据,计算过闸流量。要实现全灌区水资源动态配置、精准灌溉&#xff0…

C语言小项目 -- 通讯录完整代码(登陆系统+动态开辟 + 文件操作)

目录 📰0. 项目介绍 📰1. 开发环境及框架 📰2. 通讯录账户模块功能分析实现: 📱2.1 通讯录账户菜单界面及数据结构设计 📱2.2 通讯录账户注册功能实现 📱2.3 通讯录账户登录功能实现 &am…

完美解决丨 - [SyntaxError: invalid syntax](#SyntaxError-invalid-syntax)

目录 报错名称SyntaxError: invalid syntaxNameError: name xx is not definedIndentationError: expected an indented blockAttributeError: xx object has no attribute xxTypeError: xx object is not callableValueError: I/O operation on closed fileOSError: [Errno 2]…

目前的Android 市场怎么样?还好吗?

如今,随着互联网和移动设备的普及,Android 系统已成为全球最大的移动操作系统之一,成为最受欢迎的应用程序开发平台之一。作为一名 Android 开发者,我们生活中的大部分应用程序都是基于 Android 平台开发的,而我们的工…

从字节码分析String创建的几种方式

一.String a new String("a"); 1.到底会不会进入常量池 String a new String("a"); 通过idea中jclasslib插件获取到字节码 0 new #2 3 dup 4 ldc #3 <a> 6 invokespecial #4 <java/lang/String.<init> : (Ljava/lang/String;)V>9 as…

MongoDB 聚合管道中使用数组表达式运算符获取数组长度($size)和反转数组($reverseArray)

数组表达式运算符主要用于文档中数组的操作&#xff0c;本篇我们主要介绍如何使用数组表达式运算符获取数组的长度以及对数组中的数据进行反转&#xff1a; 一、准备数据 初始化成员数据 db.persons.insertMany([{ "_id" : "1001", "name" : …

go错误处理

func test() {num1 : 10num2 : 0result : num1 / num2fmt.Println("result", result)} func main() {test()for {fmt.Println("运行完毕&#xff01; main 下面的代码")time.Sleep(time.Second)}}在默认情况下&#xff0c;当发生错误后(panic) ,程序就会…

港联证券|揭秘涨停 旅游板块掀涨停潮

今天&#xff0c;A股三大股指低开低走。沪深两市收盘共38股涨停。剔除7只ST股&#xff0c;合计31股涨停。另外&#xff0c;14股封板未遂&#xff0c;整体封板率为73.08%。 涨停战场&#xff1a;6股封单资金超亿元 港联证券核算&#xff0c;从收盘涨停板封单量来看&#xff0c;…

【Pytorch】数据预处理

Pytorch是机器学习里面常用的框架之一&#xff0c;我们在学习机器学习之前最好需要学习如何使用这个框架对我们将要使用的数据数据进行预处理操作。 如果我们想要学习好pytorch里面的方法&#xff0c;我们需要常去用一下dir()和help()函数&#xff0c;它们一个会帮我们查看某个…

计算机软考考什么?怎么备考啊?

计算机软考是国家承认的计算机职业资格考试&#xff0c;是计算机行业从业者晋升职业等级的重要途径。计算机软考分为三个等级&#xff0c;分别是&#xff1a;初级、中级和高级。 备考计算机软考需要全面准备&#xff0c;下面我将从如何选择考试科目、如何制定学习计划、如何进…

【STL系列】unordered_set和unordered_map

前言 之前&#xff0c;我们介绍了STL中树形结构容器:set、map、multiset、multimap。 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时的效率可达到O(logN)&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;但当树中的结点非…

九龙证券|昨夜,大涨!蔚来5.99%,小鹏15.22%,理想6.39%

当地时间周一&#xff0c;美股三大指数低开高走&#xff0c;尾盘小幅收涨。盘面上&#xff0c;银行股、航空股遍及上涨。 展望本周&#xff0c;包括美联储理事沃勒、鲍曼等官员将迎来下月会议沉默期前的最终说话&#xff0c;投资者需关注其对经济和货币政策前景的看法。此外&am…

牛客网华为机考题库 C++

题目汇总HJ2 计算某字符出现次数HJ3 明明的随机数HJ4 字符串分隔HJ5 进制转换HJ6 质数因子HJ7 取近似值HJ8 合并表记录 哈希表HJ9 提取不重复的整数HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购…

快速创建springboot+springcloud项目(nacos,seata,sentinel,gateway,openfeign)

一、创建一个maven项目 1.file->new->project 2.创建maven项目 3.删除src文件夹 4.在pom.xml文件中引入springboot和cloudAlibaba依赖 <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId>&l…

用Python解决Excel问题的最佳姿势

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 「问题说明」 这次要处理的excel有两个sheet&#xff0c;要根据其中一个sheet的数据来计算另外一个sheet的值。造成问…

循环神经网络

循环神经网络(Recurrent Neural Network&#xff0c;RNN)与卷积神经网络一样,都是深度学习中的重要部分。循环神经网络可以看作一类具有短期记忆能力的神经网络。在循环神经网络中&#xff0c;神经元不但可以接收其他神经元的信息&#xff0c;也可以接收自身的信息&#xff0c;…

ChatGPT 速通手册——开始提问

开始提问 当我们完成注册后&#xff0c;页面自动会跳转到ChatGPT的主页面&#xff0c;在这里我们就可以开始进行对话了。 我们在页面下方的输入框中填写问题&#xff0c;然后回车或者点击小飞机&#xff0c;我们的问题和ChatGPT的答案就会在页面上方以一问一答的格式展现出来…

Packet Tracer 的安装过程

Packet Tracer 的安装过程 下载地址 链接&#xff1a;https://pan.baidu.com/s/1KO-vJ1p-miU7LXRH92hLww 提取码&#xff1a;ocwu 、双击运行 Crack 文件夹中的"Patch.exe"程序&#xff0c;点击 Patch&#xff1b; 7、即可看到显示激活成功&#xff0c;接下来打开…

Matplotlib学习挑战第四关-网格线grid

Matplotlib 网格线 我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。 grid() 方法语法格式如下&#xff1a; matplotlib.pyplot.grid(bNone, whichmajor, axisboth, )b&#xff1a;可选&#xff0c;默认为 None&#xff0c;可以设置布尔值&#xff0c;true 为显…