【Mysql】索引数据结构深入研究(二)

news2024/9/21 14:37:14

前言

在这里需要明确的一点是,数据库的引擎InnoDB或者是MyISAM引擎它们是形容数据表的,不是形容数据库的。
另外:文章中提到的索引的数据结构暂且都默认使用B+Tree

InnoDB引擎

InnoDB的索引数据文件有两个,tableName.frm和tableName.ibd文件。

  • frm文件:表结构相关信息
  • ibd文件:所有数据(按照索引数据结构构建的)
    在这里插入图片描述

在InnoDB表中,索引存储的是叶子节点上存储的是具体的数据。

MyISAM引擎

MyISAM的索引数据文件有三个,tableName.frm、tableName.MYD和tableName.MYI文件

  • frm文件:表结构的相关信息(字段啊什么信息)
  • MYD文件:数据存储(具体的数据)
  • MYI文件:索引存储(存放索引数据)
    在这里插入图片描述
select * from table where table.Col1 = 30;

我们查询上述Col1为30的数据,会从MYI文件中索引数据结构中查找对于的数据,找到叶子节点之后MyISAM引擎的叶子节点不会存储具体的数据,而是存储对于数据所在的磁盘地址,然后在从MYD文件中找到具体的对应行数据。

在这里我们只了解两种引擎下的数据存储文件结构,了解了这两种索引文件存储结构之后我们继续往下

聚集索引(聚簇索引)

叶子节点包含了完整的数据记录,在InnoDB的主键索引就是一个聚集索引。

非聚集索引(非聚簇索引)

比如MyISAM引擎的主键索引就是一个非聚集索引,MYI索引文件中的叶子节点存储的数据对应着MYD文件中的具体数据。


这里有三个问题:
1.为什么建议InnoDB表建议建主键,并且推荐使用整型的自增主键?

  • 表数据文件(ibd)文件本身就是按照B+Tree组织的一个索引结构文件,如果我们不建主键,它会默认选择一列(所有数据不相等的数据),如果所有列都不符合的话它会帮我们建一个隐藏列,隐藏列会帮我们维护一个唯一ID,然后来组织整张表的索引数据,这样会造成不必要的开销。
  • 使用整型的主键是因为在进行索引查找的时候是从根节点进行查询然后进行大小比较整型的效率一定会大于非整形的比对效率,并且整型的磁盘空间占用要小于非整型
  • 使用自增主键会增加插入效率,如果使用非自增的主键,会导致索引的数据结构重新排列(B+Tree是排好序的数据结构)和树的平衡,自增主键只会往右开辟节点

2.聚集索引和非聚集索引查询效率如何?

从上面很容易看出来,聚集索引可以很直接的拿到数据,因此聚集索引效率要高

3.为什么非主键索引(二级索引,非聚集索引)结构叶子节点存储的是主键值(如图)

一致性和节省存储空间:节约空间应该比较好理解,一致性问题就是减少复杂增度,插入的时候只需要关注主键索引的数据就行。
在这里插入图片描述

联合索引

在这里插入图片描述
如上图,我们建立 nameageposition 的主键联合索引。

联合索引的数据结构是有顺序的,比如它先比较name的值,name的值相同在比较age,age相同在比较postion,可以仔细观察一下上述的图体会一下,然后在索引命中的时候是遵循最左前缀匹配的比如:

select * from table where name ='Bill';
select * from table where age = 30 and position='dev';
select * from table where position = 'dev';

比如上述Sql,只有第一个会命中索引,在或者如下sql

select * from table where age = 30 and position='dev' and name = 'Bill';

这个sql是可以进行索引查询的,因为这种条件的情况下Mysql内部会进行优化。

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

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

相关文章

Redis7【⑦ Redis哨兵(sentinel)】

Redis哨兵 Redis Sentinel(哨兵)是 Redis 的高可用性解决方案之一,它可以用于监控和管理 Redis 主从复制集群,并在主节点发生故障时自动将从节点升级为新的主节点,从而保证系统的高可用性和可靠性。 Redis Sentinel …

v8-tc39-ecma262:数组push执行了什么?

v8开发文档介绍 v8新特性 tc39-ecma262-push函数执行步骤 上图步骤,解释如下: 如果是对象,则当作对象调用设置该值如果是类数组,则执行类数组调用设置该值如果参数有多个参数,则:如果,参数长度…

golang,OpenGL,计算机图形学(二)

代码仓库 https://github.com/phprao/go-graphic 变换 矩阵操作与向量操作:https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations/ 在OpenGL中,由于某些原因我们通常使用44的变换矩阵,而其中最重要的原因就是大…

uniapp的表单校验方式整理

uniapp的表单校验方式整理 这里我使用的模板为: 第一种: uniapp本身自带表单校验的js文件,代码写的很简洁,也是比较全面的 只要按照规则校验即可,下面是对应的校验代码: /** 数据验证(表…

Jenkins 2.4 创建子节点

在 Dashboard > 系统管理 > 节点列表 页面,选择 New Node 按钮,新建节点 windows_10,节点类型选择 固定节点,点击 Create 创建: 将 远程工作目录 设置子节点电脑上的执行工作目录,例如在D盘创建一个 …

Django框架-3

使用admin后台管理数据 创建模型类 模型类:应用中的models.py文件中 from django.db import models# Create your models here. # 模型类必须要继承models.Model class doogs(models.Model):# 属性create_time models.DateTimeField(auto_now_addTrue, verbose_…

新闻丨INDEMIND荣获2023年北京市朝阳区创新型中小型企业认定

近日,北京市朝阳区科学技术和信息化局公布了“朝阳区2023年度第五批创新型中小企业名单”,INDEMIND凭借专业研发和创新能力等优势,成功入选。 创新型中小企业名单依据工业和信息化部2022年6月发布《优质中小企业梯度培育管理暂行办法》&#…

Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort

目录 324. 摆动排序 II Wiggle Sort ii 🌟🌟 280. 摆动排序 I Wiggle Sort i 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

威胁建模之绘制数据流图

0x00 前言 1、什么是威胁建模: 以结构化的方式思考、记录并讨论系统存在的安全威胁,并针对这些威胁制定相应的消减措施。 2、为什么要威胁建模: (1)在设计阶段开展威胁建模,一方面可以更全面的发现系统存…

数据结构--静态链表

数据结构–静态链表 单链表 VS 静态链表 单链表:各个结点在内存中星罗棋布、散落天涯。 静态链表:分配一整片连续的内存空间,各个结点集中安置。 代码定义 代码一: #define MaxSize 10 //静态链表的最大长度 typedef struct //静态链表结构类型的定…

无限容量分布式文件存储解决方案

常见分布式文件系统 常见分布式文件系统比较 常见的分布式文件系统有GFS、HDFS 、Ceph 、GridFS 、TFS、FastDFS等。各自适用于不同的领域。 类 Google FS 都支持文件冗余备份,例如 Google FS、TFS 的备份数是 3。一个文件存储到哪几个存储结点,通常采…

《计算机系统与网络安全》第一章 计算机系统与网络安全概述

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

java的注解方式和xml方式这两种方式对数据库进行操作详解

首先需要引入mybatisplus包 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version> </dependency>第一种注解方式&#xff1a;参数是通过#{}来接收的 p…

腾讯云服务-云点播:删除腾讯云点播录制的视频文件(保存在腾讯云是需要收费的)

文档地址&#xff1a;登录 - 腾讯云https://console.cloud.tencent.com/api/explorer?Productvod&Version2018-07-17&ActionDeleteMedia 使用python后端删除&#xff1a; import json from tencentcloud.common import credential from tencentcloud.common.profile…

kafka入门,数据有序、数据乱序(十)

数据有序 数据乱序 max.in.flight.requests.per.connection指定了生产者在接收到服务器相应之前可以发送多个消息。 kafka在1.x版本之前保证单分区有序&#xff0c;条件如下 max.in.flight.requests.per.connection1 2) kafka在1.x及以后版本保证数据单区间分区有序&#xff0…

vue 函数式(编程式) render (functional:true)

文章目录 一、文档二、区别三、使用h函数的参数解释&#xff1a;参数一&#xff1a;使用导入的组件名 参数二&#xff1a;绑定css绑定事件往组件里面传递参数动态绑定值props动态绑定值datafunctional:true到底是做什么的&#xff1f;动态绑定props 非functional:true版本 参数…

JSONUtil.toJsonStr 时间变成了时间戳

问题描述 我的接口是以Date来接收日期的&#xff0c;然后我在拿到这个对象参数后&#xff0c;通过hutool当中的JSONUtil.toJsonStr将其序列化成json字符串&#xff0c;然后存储到数据库。然后存储到数据库当中发现这个字段是时间戳。 DateTimeFormat和JsonFormat 前者是控制 请…

动态规划详解Python

动态规划 动态规划&#xff08;Dynamic Programming&#xff09;是一种用于解决复杂问题的算法设计方法。它通常用于优化问题&#xff0c;其中问题可以被分解成一系列重叠子问题&#xff0c;通过存储并重复使用已经解决过的子问题的解&#xff0c;可以避免重复计算&#xff0c…

区块链的简单认识

比特币作为区块链的应用&#xff0c;让区块链广为人知&#xff0c;如果比特币作为第一代区块链&#xff0c;则以太坊则称为第二代区块链。我们知道&#xff0c;区块链的最主要目的就是去中心化&#xff0c;比特币则成为了decentralized currency&#xff0c;去中心化在技术上依…

跨注册中心服务同步实践

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…