【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领域的探索实践
本文内容主要基于以下开源项目探索实践, Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub:GitHub - eosphoros-ai…...
深度学习 | 基本循环神经网络
1、序列建模 1.1、序列数据 序列数据 —— 时间 不同时间上收集到的数据,描述现象随时间变化的情况。 序列数据 —— 文本 由一串有序的文本组成的序列,需要进行分词。 序列数据 —— 图像 有序图像组成的序列,后一帧图像可能会受前一帧的影响…...
VSCode 加Cortex-Debug嵌入式调试方法
简介 当使用ARM Cortex-M微控制器时,Cortex-Debug是一个Visual Studio Code的扩展,以简化调试过程。本文档介绍了如何编写启动配置(launch.json)。 settings.json配置 打开VSCode用户设置文件settings.json: 文件→偏好→设置选择用户设置: 在搜索栏中…...
etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能
介绍 今天推荐一款完全免费的ETCD客户端,可以私有化部署: etcd-workbench 开源地址:https://github.com/tzfun/etcd-workbench Gitee地址:https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…...
华为ipv6配置之ospf案例
R1 ipv6 ospfv3 1 router-id 1.1.1.1 //必须要手动配置ospf id,它不会自动生成 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 损失(激活函数) 多分类问题:输出只可能归于某一个类别,不可能同时归于多个类别。 误差的反向传播 求w的误差梯度 权值的更新...
java面试题20
Java中的类加载机制可继续通过自定义类加载器来实现热部署、插件化和动态加载等功能,使得应用程序能够在运行时加载未知的类和资源。 什么是Java中的多线程(Multithreading)?它有什么作用? 答案:多线程是一…...
【Java面试题】redis的过期策略有哪些
redis通过设置过期时间来控制键值对的存活时长,过期时间可以通过expire , pexpire expireat , pexpireat 等命令设置,String 类型数据可以通过setex命令设置过期时间。 以下介绍三种redis的过期策略: 1. 定时删除 在设置键值对的过期时…...
for参数 命令语句 变量
for 参数f skip命令语句 命令说明: 跳过文本内容(行):skip 例子: for /f "skip1" %%i in(2.txt) do echo %%i for 参数f eol命令语句 命令说明: 怱略指定字符的文本内容(文本首部…...
CentOS 8的新特性
CentOS 8在2019年发布,带来了比CentOS 7更多的新特性和改进。以下是一些主要的变化和优化: 软件包更新:CentOS 8提供了更新的软件包和程序,包括但不限于Python 3、MySQL 8、PHP 7.2、Ruby 2.5、PostgreSQL 10等。 应用流…...
vue2、vue3状态管理之vuex、pinia
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、状态管理之vuex1.1 State调用:1.2 Mutation在vuex中定义:在组件中使用: 1.3 Action在vuex中定义:将上面的减…...
axios进行图片上传组件封装
文章目录 前言图片上传接口(axios通信)图片上传使用upload上传头像效果展示总结 前言 node项目使用 axios 库进行简单文件上传的模块封装。 图片上传接口(axios通信) 新建upload.js文件,定义一个函数,该函数接受一个上传路径和一…...
2312llvm,用匹配器构建clang工具
原文 用LibTooling和LibASTMatchers构建工具 这里展示如何基于Clang的LibTooling构建有用的源到源翻译工具.基础 步骤0:取Clang 因为Clang是LLVM项目的一部分,因此你需要先下载LLVM的源码.Clang和LLVM都在同一个git仓库中,在不同的目录下.更多见入门指南. cd ~/clang-llvm…...
12.26ARM作业
三个按键中断,控制对应灯亮灭 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&…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
