当前位置: 首页 > 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&…...

3种Cookie管理方案对比:为什么本地导出才是开发者最佳选择?

3种Cookie管理方案对比&#xff1a;为什么本地导出才是开发者最佳选择&#xff1f; 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在Web开发和自动…...

RenderDoc实战:5分钟搞定OpenGL性能瓶颈定位(附Android联调技巧)

RenderDoc实战&#xff1a;5分钟定位OpenGL性能瓶颈的完整指南 移动端图形开发最令人头疼的瞬间&#xff0c;莫过于看到测试报告上"FPS波动大"的红色标记&#xff0c;却不知道从哪开始排查。上周团队里新来的工程师花了三天时间逐行检查着色器代码&#xff0c;最后发…...

Linux系统CPU负载与使用率详解及性能监控

1. CPU负载与CPU使用率的本质区别在Linux系统监控和性能调优过程中&#xff0c;CPU负载和CPU使用率这两个指标经常被混淆使用。作为系统管理员&#xff0c;我曾多次遇到团队成员将这两个概念混为一谈的情况&#xff0c;这往往导致对系统性能问题的误判。让我们先从一个实际案例…...

深度解析Windows设备指纹伪装技术:EASY-HWID-SPOOFER内核级硬件隐私保护实现

深度解析Windows设备指纹伪装技术&#xff1a;EASY-HWID-SPOOFER内核级硬件隐私保护实现 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在数字化时代&#xff0c;硬件隐私保护已成…...

AD快捷键避坑指南:为什么你的自定义快捷键总是不生效?

AD快捷键避坑指南&#xff1a;为什么你的自定义快捷键总是不生效&#xff1f; 在AD&#xff08;Altium Designer&#xff09;这个功能强大的电子设计自动化软件中&#xff0c;快捷键是提升工作效率的利器。但很多用户都遇到过这样的困扰&#xff1a;明明按照教程设置了自定义快…...

5分钟搞定:Mac用户制作Windows启动盘的终极指南

5分钟搞定&#xff1a;Mac用户制作Windows启动盘的终极指南 【免费下载链接】windiskwriter &#x1f5a5; A macOS app that creates bootable USB drives for Windows. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. 项目地址: https://g…...

UDS诊断服务-10例程控制服务(0x31)实战:从协议解析到车辆传感器校准

1. 从车辆抖动问题认识0x31服务的重要性 去年夏天&#xff0c;我遇到一辆行驶里程8万公里的SUV&#xff0c;车主反映急加速时发动机抖动明显。用诊断仪读取故障码显示"P0172 - 燃油修正系统过浓"&#xff0c;但更换氧传感器和火花塞后问题依旧。这时候就需要请出我们…...

Hi3559平台ISP调试实战:从参数配置到画质优化

1. Hi3559平台ISP基础概念与工作原理 第一次接触Hi3559平台的ISP模块时&#xff0c;我完全被各种专业术语搞晕了。后来在调试车载摄像头项目时才发现&#xff0c;理解ISP的工作原理对画质优化有多重要。简单来说&#xff0c;ISP就像是我们手机里的美颜功能&#xff0c;只不过它…...

Qwen3.5-9B实战案例:用128K上下文做法律合同比对与风险提示

Qwen3.5-9B实战案例&#xff1a;用128K上下文做法律合同比对与风险提示 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;在专业领域的逻辑推理和长文本处理方面表现出色。本文将重点展示如何利用其128K tokens的超长上下文能力&#xff0c;实现法律合…...

Java程序员如何入门音视频开发

对于Java程序员来说&#xff0c;他们缺乏参与音频和视频项目的经验。如何快速开始&#xff1f;你需要立即学习C吗&#xff1f;答案是否定的。 成功的关键在于循序渐进&#xff0c;从扎实的理论基础入手。第一步是学习多媒体基础理论。一本名为“多媒体基础概论”的教科书&#…...