【MySQL】InnoDB和MyISAM区别

文章目录

  • 一、索引不同
    • 1 InnoDB聚簇索引,MyISAM非聚簇索引
      • 1 InnoDB聚簇索引
      • 2 MyISAM非聚簇索引
    • 2 InnoDB必须要有主键,MyISAM允许没有主键
    • 3 InnoDB支持外键
    • 4 InnoDB不支持全文索引
    • 5 索引保存位置不同
  • 二、对事物的支持
  • 三、存储结构不同
  • 四、存储空间不同
  • 五、支持锁粒度不同
  • 六、count()函数不同
  • 七、常见问题
    • 1 InnoDB 为什么一定要有主键?
    • 2 InnoDB 为什么推荐使用整型的自增主键做索引?
    • 3 为什么InnoDB主键索引结构叶子节点存储的是主键值?
    • 4 聚簇索引,和非聚簇索引哪个查询效率更快?
    • 5 联合索引的底层结构长什么样?
    • 6 最左前缀原则

一、索引不同

1 InnoDB聚簇索引,MyISAM非聚簇索引

MyISAM 这棵树的叶子结点存储数据是物理地址,InnoDB的叶子结点直接存储数据记录,这也是簇索引与非簇索引的区别。

1 InnoDB聚簇索引

  • 表数据文件本身就是按B+Tree组织的一个索引结构文件,数据文件是和(主键)索引绑在一起的
  • 聚集索引 - 叶子节点包含了完整的数据记录
  • 必须要有主键,通过主键索引效率高。如果建表时未创建主键,MySQL会从表中找到一列全部不相等的数据,作为主键,维护索引树,如果找不到,则维护一个隐藏列,用于维护索引树。这个工作尽量让我们自己完成,不必再消耗MySQL的性能。
  • 辅助索引叶子节点存储的数据为主键id;
  • 使用辅助索引查询时,需要查询两次,先查询到主键,然后再通过主键查询到数据。
innodb主键索引:查找数据流程  -- 查询主键 = 30的数据;
1 将根节点,加载到内存中,在内存中通过二分查找算法,快速找出30的位置,找到对应的页;
2 再将这一页数据,加载到内存中,快速找出30的位置,找到对应的页;
3 最后定位到叶子节点,对应位置,从叶子节点中取出数据data。

在这里插入图片描述

innodb辅助索引 : 查找数据流程   - -  辅助索引 = Eric
1 将辅助索引的根结点,加载到内存中,在内存中通过二分查找,找出对应页;
2 以此类推,直到定位到叶子节点,对应位置,从叶子节点中取出,当条数据的主键id;
3 使用主键id,在主键索引树中,回表查询,查处对应数据。

在这里插入图片描述

2 MyISAM非聚簇索引

  • MyISAM是非聚簇索引,索引和数据分开存储,也是使用B+Tree作为索引结构,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  • MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
  • 叶子节点只包含索引地址,不包含数据,数据在另外一个文件MYD文件。
MyISAM 查找数据流程:查找col = 30的数据
1 从MYI文件中,查找索引树,定位数据所在的叶子节点,通过叶子节点中包含的数据地址;
2 在图中右下加,MYD文件中,找出具体的数据。

在这里插入图片描述

2 InnoDB必须要有主键,MyISAM允许没有主键

  • MyISAM 允许没有任何索引和主键的表存在,索引都是保存行的地址。
  • InnoDB 如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

3 InnoDB支持外键

  • InnoDB支持外键,而MyISAM 不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

4 InnoDB不支持全文索引

  • InnoDB不支持fulltext全文索引,MyISAM支持;InnoDB不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好。

5 索引保存位置不同

  • MyISAM 的索引以表名+.MYI文件分别保存。
  • InnoDB的索引和数据一起保存在表空间里。

二、对事物的支持

  • InnoDB支持事务,MyISAM不支持。
  • InnoDB支持事务,支持外键、行锁、事务是他的最大特点,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务。
  • MyISAM 强调的是性能,每次查询具有原子性。其执行数度比InnoDB类型更快,但是不提供事务支持)。MyISAM 默认表类型,它是基于传统的ISAM类型,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键。

三、存储结构不同

  • MyISAM 数据和索引是分别存储的,数据文件的扩展名为(.MYD)。索引文件的扩展名是(.MYI)。
  • InnoDB 数据和索引是集中存储的(.ibd),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

四、存储空间不同

  • MyISAM 可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
  • InnoDB 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

五、支持锁粒度不同

  • MyISAM 只支持表级锁,用户在操作MyISAM 表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
  • InnoDB支持事务和行级锁,行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

六、count()函数不同

  • MyISAM 保存有表的总行数,如果select count(*) from table;会直接取出出该值。

  • InnoDB 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,MyISAM 和InnoDB处理的方式都一样。

七、常见问题

1 InnoDB 为什么一定要有主键?

1 bd文件在存储的时候,这个文件必须用B+树的结构来组织,B+树来源:
2 有主键,直接用主键;
3 没有主键不建索引,MySQL会从表中找到一列全部不相等的数据,作为主键,维护索引树,
4 如果找不到,则维护一个隐藏列,用于维护索引树。
5 这个工作尽量让我们自己完成,不必再消耗MySQL的性能。

2 InnoDB 为什么推荐使用整型的自增主键做索引?

整型:
1 查找元素,都从根节点开始查找,经历了很多次比较大小的操作,
使用整型比较大小更快,字符串比较大小逐位比较,从左到右,整型效率更快。 
2  一个索引占用的磁盘空间越小,整个索引占用的空间也就越小。节约磁盘(很贵)空间,整型占用的页大小,更小 。
自增:
1 B+树,叶子节点是双向指针,排好序的,对范围查找友好;
2 B+树,插入非自增的索引,索引树可能需要分裂、树需要再次平衡;
插入自增主键,可以减少索引树分裂和再次平衡的问题

3 为什么InnoDB主键索引结构叶子节点存储的是主键值?

1   一致性和节省存储空间
2   innodb只有一个聚簇索引,如果建了主键,就会直接用主键做聚簇索引。
3   二级索引的叶子节点放的值,是聚集索引的索引值。为了保证一致性、节省存储空间,减少复杂度。二级索引,是非聚集索引,稀疏索引,需要回表查询。

4 聚簇索引,和非聚簇索引哪个查询效率更快?

1   聚簇索引更快,定位到叶子节点时,就已经拿到了整行数据;
2   非聚簇索引,需要跨文件去查,在MYI文件中找到叶子节点中数据地址,
在通过数据地址在MYD文件中,去查找整行数据;

5 联合索引的底层结构长什么样?

1    图中是联合主键索引,是聚集索引,按照联合主键字段从左到右的顺序,左小右大的顺序进行排序。
叶子节点数据页,保存的是具体的数据,不是聚集索引的值,不用做回表操作。
2   树的高度要提升,即需要把当前页的第一个数据的索引,提升上去

在这里插入图片描述

6 最左前缀原则

1   索引是排好序的数据结构;
2   不按照最左前缀原则走,使用的索引不符合排好序的原则,索引就会失效。

如有缺漏或不对的地方还请各位指正。

欢迎关注我的个人公众号
在这里插入图片描述

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

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

相关文章

Elasticsearch中复制一个索引数据到新的索引中

问题 我有时候,需要调试一个已经存在的ES索引,需要从已有的索引复制数据到新的索引中去。 解决 这里我借助一个GUI工具,来解决这个问题,底层它是使用Reindex的API实现索引数据复制的。 步骤 选中已存在的redix菜单&#xff0…

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具,也称之为代码版本控制工具,代码版本控制或管理的工具用的最多的: svn、 git。 SVN 是采用的 同步机制,即本地的代码版本和服务器的版本保持一致(提…

KEPServerEX 6 之【外篇-1】PTC-ThingWorx服务端软件安装 Tomcat10本地安装

本文目标: 安装 Java 和 Apache Tomcat ,为ThingWorx安装做基础。 ----------------------------------------------------------------------- 安装重点 --------------------------------------------------------------------- 1. 安装 Java 11 / JDK 11 添加系…

SSRF中Redis的利用

目录 1. SSRF 1.1 什么是SSRF 1.2 漏洞成因 1.3 可能会存在SSRF的地方 1.4 SSRF分类 1.5 验证方法 1.6 利用方式 1.7 可以利用的协议 1.8 SSRF过滤绕过 2. SSRF攻击Redis 2.1 环境搭建 2.2 漏洞复现(通过ssrf利用redis写入webshell) 2.2.1 想要写入webshell的两个…

【unity学习笔记】4.场景切换

创建空物体→创建脚本挂载在空物体上→打开脚本 1.创建所需要的场景 assets中点击创建场景 2.文件→生成设置 3.将需要的场景拖入 4.场景跳转 创建空对象,将脚本放在空对象上。 注意两个类:场景类、场景管理类 void Start(){//场景跳转SceneManager.Lo…

labelme目标检测数据类型转换

1. labelme数据类型 LabelMe是一个开源的在线图像标注工具,旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面,让用户可以直观地在图像上绘制标记框、多边形、线条等,以标识和注释图像中的对象或区域。 GitHub:http…

智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

C# 使用Pipelines处理Socket数据包

写在前面 在上一篇中对Pipelines进行简单的了解,同时也留下了未解的问题,如何将Pipelines类库运用到Socket通讯过程中来解决粘包和分包。链接地址如下: 初识System.IO.Pipelines https://rjcql.blog.csdn.net/article/details/135211047 这…

Hive安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码,使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String&am…

前端开发之通过vue-office组件实现文件预览

前端开发之通过vue-office组件实现文件预览 前言效果图docx文件xlsx文件pdf文件 vue中简单案例1、安装组件2、vue中代码 前言 在实现文件预览的时候我们可以通过vue-office组件来实现文件的预览效果 效果图 docx文件 xlsx文件 pdf文件 vue中简单案例 1、安装组件 整体安装…

RabbitMQ入门指南(九):消费者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消费者确认机制 二、失败重试机制 三、失败处理策略 四、业务幂等性 1.通过唯一标识符保证操作的幂等性 2.通过业务判断保证操作的幂等性 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系…

词表示:语言与计算的桥梁

目录 前言1 什么是词表示2 独热表示3 上下文表示4 分布式表示结语 前言 在自然语言处理领域,词语的表示是一个基本挑战。将词语转换为计算机可以理解的符号,衡量词语之间的相似度,捕捉它们之间复杂的关系,是使机器能够理解和处理…

Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络(Bluetooth mesh)概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范(Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol)是由蓝牙技术联盟(Bluetooth SIG)开…

EasyExcel实现动态表头(注解实现)

要实现上述动态头,按每日统计,每月统计,每年统计。而时间是一直变化,所以我们需要表头也一直动态生成。 首先,我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

css 设置字体渐变色和阴影

一、需求 我们平时写样式的时候可能遇到需要将字体设置成渐变色,这样能使界面整体美化提升,那么css怎么去实现这个功能呢?下面我介绍一种常用的方法,欢迎大家补充 二、渐变实现 先看效果图: 直接上代码: /…

Seem环境安装

创建虚拟环境 conda create -n seem python3.8 conda activate seem 安装相关依赖:(不按照的话会报错) sudo apt-get install openmpi-bin libopenmpi-devconda install gcc_linux-64pip install mpi4py 导入环境 export PYTHONPATH$(pwd…

开发效率之把握需求、减少返工

前言 当年初入软件开发行业的我,拿到需求就莽,要设计没设计,要分析没分析,结果就是没理清楚需求,致使频频返工。 需求没理解对,做得再多再好也白搭。 估算需求把握程度 假如每个IF分支的“是”加一分&…

2024 年全球顶级的 3 款 桌面 PDF 转换工具

桌面 PDF 转换器工具是一种软件应用程序,使用户能够将 PDF 文件与不同的文件格式相互转换。奇客PDF转换、Nitro Pro 和 Foxit PhantomPDF 是市场上最好的桌面 PDF 转换工具。 在选择最好的 PDF 转换器软件时,需要考虑的一个重要因素是它与其他软件的集成…

nvm 的安装及使用 (Node版本管理器)

目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management ,专门针对 node 版本进行管理的工具,通过它可以安装和切换不同版本的…

数据链路层解读

基本介绍 概述 数据链路层使用的信道主要有两种类型 点对点信道。使用一对一的点对点通信方式的信道。广播信道。使用一对多的广播通信方式的信道。由于广播信道上连接的主机很多,必须使用专用的共享信道协议来协调这些主机的数据发送,因此通信过程比较…