当前位置: 首页 > news >正文

【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   不按照最左前缀原则走,使用的索引不符合排好序的原则,索引就会失效。

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

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

相关文章:

【MySQL】InnoDB和MyISAM区别

文章目录 一、索引不同1 InnoDB聚簇索引,MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键,MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…...

3分钟了解安全数据交换系统有什么用!

企业为了保护核心数据安全,都会采取一些措施,比如做网络隔离划分,分成了不同的安全级别网络,或者安全域,接下来就是需要建设跨网络、跨安全域的安全数据交换系统,将安全保障与数据交换功能有机整合在一起&a…...

记录汇川:MODBUS TCP-梯形图

H5U的MODBUS通信不需要编写程序,通过组态MODBUS通信配置表,实现数据通信。 Modbus-TCP 主站即Modbus-TCP客户端,通过Modbus-TCP配置,可最多支持同时与31个 Modbus-TCP服务器(从站)进行通讯。 …...

electron + sqlite3 解决打包后无法写入数据库

前言 window环境。 electron28.0.0 sqlite35.1.6 使用 electron-builder 打包。 本文旨在解决打包后无法写入数据库的问题。 但如果你是打包后无法访问sqlite,且有报错弹窗,不妨也看看本文。 也许是同一种原因。 错误原因分析 打包后无法创建db文件&…...

【uniapp小程序-生成二维码+多个图片文字合并一张图】

<!-- 二维码 --><canvas id"qrcode" canvas-id"qrcode" width"120" ></canvas><!-- 生成带小程序码的分享图片 --><canvas canvas-id"shareCanvas" class"share-canvas"></canvas>#qrc…...

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…...

深度学习 | 基本循环神经网络

1、序列建模 1.1、序列数据 序列数据 —— 时间 不同时间上收集到的数据&#xff0c;描述现象随时间变化的情况。 序列数据 —— 文本 由一串有序的文本组成的序列&#xff0c;需要进行分词。 序列数据 —— 图像 有序图像组成的序列&#xff0c;后一帧图像可能会受前一帧的影响…...

VSCode 加Cortex-Debug嵌入式调试方法

简介 当使用ARM Cortex-M微控制器时&#xff0c;Cortex-Debug是一个Visual Studio Code的扩展&#xff0c;以简化调试过程。本文档介绍了如何编写启动配置(launch.json)。 settings.json配置 打开VSCode用户设置文件settings.json: 文件→偏好→设置选择用户设置: 在搜索栏中…...

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…...

华为ipv6配置之ospf案例

R1 ipv6 ospfv3 1 router-id 1.1.1.1 //必须要手动配置ospf id&#xff0c;它不会自动生成 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address 2000::2/96 ospfv3 1 area 0.0.0.0 interface LoopBack0 ipv6 enable ipv6 address 2001::1/96 ospfv3 1 area 0.0.0.0 R2…...

Design patterns--装饰模式

设计模式之装饰模式 使用装饰模式来封装Nmea0183语句。 代码 #ifndef DATAPARSER_H #define DATAPARSER_H#include <string> #include <vector>class DataParser { public:DataParser();virtual std::string fieldAnalysis(std::vector<std::string> vecSt…...

卷积神经网络 反向传播

误差的计算 softmax 经过softmax处理后所有输出节点概率和为1 损失&#xff08;激活函数&#xff09; 多分类问题&#xff1a;输出只可能归于某一个类别&#xff0c;不可能同时归于多个类别。 误差的反向传播 求w的误差梯度 权值的更新...

java面试题20

Java中的类加载机制可继续通过自定义类加载器来实现热部署、插件化和动态加载等功能&#xff0c;使得应用程序能够在运行时加载未知的类和资源。 什么是Java中的多线程&#xff08;Multithreading&#xff09;&#xff1f;它有什么作用&#xff1f; 答案&#xff1a;多线程是一…...

【Java面试题】redis的过期策略有哪些

redis通过设置过期时间来控制键值对的存活时长&#xff0c;过期时间可以通过expire , pexpire expireat , pexpireat 等命令设置&#xff0c;String 类型数据可以通过setex命令设置过期时间。 以下介绍三种redis的过期策略&#xff1a; 1. 定时删除 在设置键值对的过期时…...

for参数 命令语句 变量

for 参数f skip命令语句 命令说明&#xff1a; 跳过文本内容&#xff08;行&#xff09;&#xff1a;skip 例子&#xff1a; for /f "skip1" %%i in(2.txt) do echo %%i for 参数f eol命令语句 命令说明&#xff1a; 怱略指定字符的文本内容&#xff08;文本首部…...

CentOS 8的新特性

CentOS 8在2019年发布&#xff0c;带来了比CentOS 7更多的新特性和改进。以下是一些主要的变化和优化&#xff1a; 软件包更新&#xff1a;CentOS 8提供了更新的软件包和程序&#xff0c;包括但不限于Python 3、MySQL 8、PHP 7.2、Ruby 2.5、PostgreSQL 10等。 应用流&#xf…...

vue2、vue3状态管理之vuex、pinia

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、状态管理之vuex1.1 State调用&#xff1a;1.2 Mutation在vuex中定义&#xff1a;在组件中使用&#xff1a; 1.3 Action在vuex中定义&#xff1a;将上面的减…...

axios进行图片上传组件封装

文章目录 前言图片上传接口&#xff08;axios通信)图片上传使用upload上传头像效果展示总结 前言 node项目使用 axios 库进行简单文件上传的模块封装。 图片上传接口&#xff08;axios通信) 新建upload.js文件&#xff0c;定义一个函数&#xff0c;该函数接受一个上传路径和一…...

2312llvm,用匹配器构建clang工具

原文 用LibTooling和LibASTMatchers构建工具 这里展示如何基于Clang的LibTooling构建有用的源到源翻译工具.基础 步骤0:取Clang 因为Clang是LLVM项目的一部分,因此你需要先下载LLVM的源码.Clang和LLVM都在同一个git仓库中,在不同的目录下.更多见入门指南. cd ~/clang-llvm…...

12.26ARM作业

三个按键中断&#xff0c;控制对应灯亮灭 main.c #include "key_it.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){all_led_init();key1_it_config();key2_it_config();key3_it_config();while(1){printf("do main...\n&…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...