MyISAM存储引擎中的索引方案

news2024/7/4 6:01:43

MyISAM存储引擎中的索引

我们知道 InnoDB存储引擎中索引即数据,也就是聚集索引的那棵B+树的叶子节点中已经把所有完整的用户记录都包含了,而MyISAM引擎也使用B+Tree作为索引结构,但是却 将索引和数据分开存储,其特点如下:

  • MyISAM存储引擎将记录按照插入顺序单独存储在一个文件中,称之为「数据文件」。这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少记录就成了。就不像InnoDB存储引擎在插入数据的时候就将数据放在聚簇索引树中,按照主键大小排序
  • MyISAM存储引擎会把索引信息另外存储到一个文件中,称之为「索引文件」。MyISAM会单独为表的主键创建一个索引,只不过在索引的叶子节点中存储的不是完整的用户记录,而是「主键值 + 数据记录地址」的组合。

在这里插入图片描述

这里设表一共有三列,假设我们以Col1为主键,上图是一个MyISAM表的主索引 (Primary key)示意。可以看出MyISAM的索引文件叶子结点仅仅保存数据记录的地址偏移量在MyISAM中,主键索号和二级素引(Secondary key)在结构上没有任何区别,只是主键素引要求key是唯一的,而二级素引的key可以重复。如果我们在Col2上建立一个二级索引,则此索引的结构如下图所示:

在这里插入图片描述

同样也是一棵B+Tree,根据二级索引的key有序组织,叶子结点的data域保存数据记录的地址偏移量。因此,MyISAM中索引检索的算法为:首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM 与 InnoDB对比

MyISAM的索引方式都是“非聚簇”的(索引都不包含数据,只包含数据地址),与InnoDB包含1个聚簇索引是不同的。小结两种引擎中索引的区别:

  1. 在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在 MyISAM 中都需要进行一次回表操作,意味着MyISAM中建立的索引相当于全部都是二级索引

  2. InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

  3. InnoDB的二级索引叶子节点data域存储相应记录「主键的值」 ,而MyISAM索引记录的是「数据地址」。

  4. MyISAM的「回表操作是十分快速」的,因为是拿着地址偏移量直接到文件中取数据的,反观InnoDB是通过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。

  5. InnoDB要求表必须有主键 ( MyISAM可以没有 )。如果没有显式指定,则MySQL系统会自动选择一个非空且唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

小结:

了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助。比如:

举例1:知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有二级索引都引用主键索引,过长的主键索引会令二级索引占用的空间过大。

举例2:用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一棵B+Tree,非单调的主键会造成在插入新记录时,数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

在这里插入图片描述

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

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

相关文章

ElasticSearch Docker 部署实例

文章目录前言基本环境构建Java安装docker安装es部署安装ES验证安装安装kibana设置密码进入es容器安装Vim修改es容器配置文件设置es访问密码设置Kibana密码理想状态方案二修改挂载安装IK分词器安装ik分词器在线安装离线安装前言 虽然说要停更,但是有些东西还是需要记…

SpringMVC | SSM整合(SpringMVC+Spring+MyBatis)

0️⃣概述👾SSM与三层架构对应关系SpringMVC —— 表示层(controller、view)Spring —— 业务逻辑层(service)MyBatis —— 数据访问层(dao、pojo)👾配置文件spring-config.xml ——…

vue全家桶之vuex详解

文章目录Vuex 概述1.1 组件之间共享数据的方式1.2 Vuex 是什么1.3 使用 Vuex 统一管理状态的好处什么样的数据适合存储到 Vuex 中2. Vuex 的基本使用3. Vuex 的核心概念3.1 核心概念概述3.2 State3.3 Mutation3.4 Action3.5 GetterVuex 概述 1.1 组件之间共享数据的方式 父向…

NET.前端基础

均摘自C语言中文网 网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JavaScript(简称“JS”动态脚本语言),它们三者在网页中分别承担着不同的任务。 HTML …

74. 搜索二维矩阵

74.搜索二维矩阵一、题目描述二、解题思路2.1 二分查找行2.2 二分查找列三、提交结果一、题目描述 二、解题思路 采用两次二分的方式,第一次二分用于找到target在二维矩阵中的行标,第二次二分只需要对找到的行进行二分查找即可。 2.1 二分查找行 初始…

10.3 定制操作

文章目录向算法传递函数谓词排序算法lambda表达式可调用对象介绍lambdafind_if 和 find_each的介绍lambda的捕获和返回值捕获引用捕获隐式捕获可变lambda指定lambda返回的类型函数体参数绑定标准库bind函数占位符_n具体使用bind的参数使用bind重排参数顺序绑定引用参数向算法传…

svg动画图形绘制

先介绍下绘制图形的标签 1:线段:line 2:矩形:rect 3: 圆形:circle 4:多边形:polyline(不会自动连接起点和终点) 5: 多边形:polygon (会自动连接起点和终点) v…

SAP FICO 理解统驭科目记账与特殊记账

统驭科目记账与特殊记账 【背景】 统驭科目通常分为三类:资产(A)、客户(D)和供应商(K),在创建会计科目时可在”控制数据“选项卡下进行选择。 在创建客户/供应商主数据的时候&#…

Vue插槽Slot的使用

1、认识插槽Slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示;但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些…

【零基础】学python数据结构与算法笔记15-欧几里得、RSA

文章目录前言95.欧几里得算法96.RSA算法介绍97.RSA算法测试98.算法课程总结总结前言 学习python数据结构与算法,学习常用的算法, b站学习链接 95.欧几里得算法 求最大公约数 欧几里得算法:gcd(a,b) gcd(b,a mod b) #mod取余 例&#xff1a…

04.自定义类型:结构体

1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list;//成员列表 }variable-list;//变量列表 EG: 描述一位学生: struct Stu {char name[…

Comparable+Comparator+Cloneable接口

文章目录ComparableComparatorCloneable浅拷贝深拷贝Comparable 当我们需要对一个自己写的类进行排序(Collections.sort和Arrays.sort)的时候,,就要使用到Comparable接口。 该接口中有一个compareTo方法,该方法其实就是一比较规则。 public interface…

货币银行学

建立大脑知识库 外汇储备不宜太高,2022年是3万亿。 美元贬值,大宗商品会更贵。 大宗商品 [1] (Commodities)是指可进入流通领域,但非零售环节,具有商品属性并用于工农业生产与消费使用的大批量买卖的物质商…

Oracle Id生成算法 —— 雪花算法

背景 近几日,被主键ID生成折磨的不太行,于是就在寻找一种合适的主键生成策略,选择一种合适的主键生成策略,可以大大降低主键ID的维护成本。 主键ID生成方法 最常用的4种主键ID生成方法 UUID:全局唯一性&#xff0c…

【框架】Spring

1、IOC 1、自动化配置 xml文件 注册bean 属性注入:setter,构造方法,p命名空间,外部注入 复杂属性:对象ref,数组array,list,map 依赖注入:ctx.getBean()Java配置类 Conf…

InterruptedException异常解析

Either re-interrupt this method or rethrow the “InterruptedException”. 请重新中断此方法或重新引发“InterruptedException”。 文章目录问题描述问题解析sonar检测提示规则解决方案问题描述 public void run () {try {while (true) {// do stuff}}catch (InterruptedE…

webgl变换矩阵理论详解

文章目录前言矩阵运算矩阵加减矩阵数乘矩阵乘矩阵矩阵转置逆矩阵正交矩阵矩阵变换的一般规则行主序和列主序行向量和列向量复杂变换时的顺序变换矩阵进行图形变换uniform传递矩阵平移缩放旋转组合变换实例总结前言 在webgl中将图形进行平移、旋转、缩放等操作时可以在着色器中…

11.1 使用关联容器

文章目录关联容器的类型使用map使用set关联容器中元素是按关键字保存和访问的,支持高效关键字查找和访问。顺序容器中元素是按他们在容器中的位置保存访问的。关联容器有两个主要类型:set和map。 set:每个元素包含一个关键字,想知…

OPC实践:通过 python-docx 读取 docx 文档

概述 本文记录下列命令执行的过程,通过对过程中的关键步骤进行记录,掌握 python-docx 库中 opc 与 parts 模块的源码、以及加深对 OPC 的理解。 import docx# fp 为 docx 文件路径, docx 包含一个 hello 字符串、一张 jepg 图片及一个表格…

<Python的列表和元组>——《Python》

目录 1.列表 1.1 列表的概念 1.2 创建列表 1.3 访问下标 1.4 切片操作 1.5 遍历列表元素 1.6 新增元素 1.7 查找元素 1.8 删除元素 1.9 连接列表 2. 元组 1.列表 1.1 列表的概念 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少,…