MySQL两种存储引擎及索引对比

news2024/10/7 14:27:11

MySQL两种存储引擎及索引对比

  • 前言
  • 存储引擎
    • 主要区别
    • 相关命令
    • 存储引擎1: MyISAM
    • 存储引擎2: InnoDB
    • 其他存储引擎:
  • 索引
    • 聚集(聚簇)索引
    • 二级索引
  • 常见面试题
    • 为什么 DBA 都建议表中一定要有主键,而且推荐使用整型自增?
    • 为什么要有主键?
    • 为什么推荐使用整型自增?
  • 参考资料

前言

MySQL是怎么存储数据的呢?

在之前我们聊过了**为什么 MySQL 索引要用 B+tree ,而且还这么快。**里面曾多处提到了找数据要从我们电脑的磁盘上找,今天就来说一说 MySQL 中的数据在磁盘上,它到底是如何进行存储的?长什么样?

存储引擎

百度百科是这样定义存储引擎的:MySQL 中的数据用各种不同的技术存储在文件(或者内存)中,这些不同的技术以及配套的相关功能在 MySQL 中被称作存储引擎。

简单来说就是**不同的存储引擎,我们的数据存储的格式也会不一样。**就好比图片有不同的格式,比如:.jpg, .png, .gif 等等……


扫盲:存储引擎是作用在上的。

现在 MySQL常用的存储引擎有两种:MyISAMInnoDB

MySQL 5.5之前MyISAM 是默认的存储引擎。

MySQL 5.5开始InnoDB 是默认的存储引擎。

主要区别

MyISAMInnoDB
事务不支持❌支持
表/行锁只有表锁还引入了行锁
外键不支持❌支持✔
全文索引支持✔版本5.6 开始支持
读写速度更快更慢

MyISAM 最致命的一点就是不支持事务,而 InnoDB 支持。所以现在 InnoDB 已经成为我们使用的标配、最主流的存储引擎了。

相关命令

查询当前数据库支持的存储引擎

show engines;

查询当前默认的存储引擎

show variables like '%storage_engine%';

查询表的相关信息

show table status like '表名';

存储引擎1: MyISAM

每个 MyISAM 表都以3个文件存储在磁盘上。这些文件的名称以表名开头,以扩展名指示文件类型。

.frm 文件(frame)存储表结构

.MYD 文件(MY Data)存储表数据

.MYI 文件(MY Index)存储表索引

MySQL 里的数据默认是存放在安装目录下的 data 文件夹中,也可以自己修改。

在这里插入图片描述

下面我创建了以 MyISAM 作为存储引擎的一张表 t_user_myisam。

CREATE TABLE `t_user_myisam` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COMMENT='测试用户表';

在这里插入图片描述

.MYI 文件组织索引的方式就是 B+tree。叶子节点的 value 处存放的就是索引所在行的磁盘文件地址

在这里插入图片描述

底层查找过程

首先会判断查找条件 where 中的字段是否是索引字段,如果是就会先拿着这字段去 .MYI 文件里通过 B+tree 快速定位,从根节点开始定位查找;

找到后再把这个索引关键字(就是我们的条件)存放的磁盘文件地址拿到 .MYD 文件里面找,从而定位到索引所在行的记录。


表逻辑上相邻的记录行数据在磁盘上并不一定是物理相邻的。

在这里插入图片描述

存储引擎2: InnoDB

一张 InnoDB 表底层会对应2个文件在文件夹中进行数据存储。

.frm 文件(frame)存储表结构

.ibd 文件(InnoDB Data)存储表索引+数据

下面我创建了以 InnoDB 作为存储引擎的一张表 t_user_innodb。

CREATE TABLE `t_user_innodb` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试用户表';

在这里插入图片描述

很显然,InnoDB 把索引和数据都放在一个文件里存着了。毫无疑问,InnoDB 表里面的数据也是用 B+tree 数据结构组织起来的。

下面我们来看看它具体是怎么存储的。

在这里插入图片描述

.ibd 存储数据的特点就是 B+tree 的叶子节点上包括了我们要的索引和该索引所在行的其它列数据

底层查找过程

首先会判断查找条件 where 中的字段是否是索引字段,如果是就会先拿着这字段去 .ibd 文件里通过 B+tree 快速定位,从根节点开始定位查找;

找到后直接把这个索引关键字及其记录所在行的其它列数据返回。

在这里插入图片描述

其他存储引擎:

我们在新建表的时候, 可以选择不同的存储引擎, 如下图: 其他引擎确实没有用过, 这里不再看了, 反正也用不到. 😂

在这里插入图片描述

索引

聚集(聚簇)索引

聚集索引:叶子节点包含了完整的数据记录。

简单来说就是索引和它所在行的其它列数据全部都在一起了。

很显然,MyISAM 没有聚集索引,InnoDB 有,而且 InnoDB 的主键索引就是天然的聚集索引。

有聚集索引当然就有非聚集索引(稀疏索引)。对于 MyISAM 来说,它的索引就是非聚集索引。因为它的索引数据分开两个文件存的:一个 .MYI 存索引,一个 .MYD 存数据。

二级索引

除聚集索引之外的所有索引都叫做二级索引,也称辅助索引。

它的叶子节点则不会存储其它所有列的数据,就只存储主键值

在这里插入图片描述

底层查找过程

每次要找数据的时候,会根据它找到对应叶子节点的主键值,再把它拿到聚集索引的 B+tree 中查找,从而拿到整条记录。

在这里插入图片描述

优点:保持一致性和节省空间。

常见面试题

为什么 DBA 都建议表中一定要有主键,而且推荐使用整型自增?


注意:这里是推荐,没说一定。非要用 UUID 也不拦着你😁

为什么要有主键?

因为 InnoDB 表里面的数据必须要有一个 B+tree 的索引结构来组织、维护我们的整张表的所有数据,从而形成 .idb 文件。

那和主键有什么关系?

如果 InnoDB 创建了一张没有主键的表,那这张表就有可能没有任何索引,则 MySQL会选择所有具有唯一性并且不为 null 中的第一个字段的创建聚集索引。

如果没有唯一性索引的字段就会有一个隐式字段成为表的聚集索引:而这个隐式字段,就是 InnoDB 帮我们创建的一个长度为 6字节 的整数列 ROW_ID,它随着新行的插入单调增加,InnoDB 就以该列对数据进行聚集。

使用这个 ROW_ID 列的表都共享一个相同的全局序列计数器(这是数据字典的一部分)。为了避免这个 ROW_ID 用完,所以建议表中一定要单独建立一个主键字段。

为什么推荐使用整型自增?

首先整型的占用空间会比字符串,而且在查找比大小也会比字符串更。字符串比大小的时候还要先转换成 ASCII 码再去比较。

如果使用自增的话,在插入方面的效率也会提高。

不使用自增,可能时不时会往 B+tree 的中间某一位置插入元素,当这个节点位置放满了的时候,节点就要进行分裂操作(效率低)再去维护,有可能树还要进行平衡,又是一个耗性能的操作。

都用自增就会永远都往后面插入元素,这样索引节点分裂的概率就会小很多。

参考资料

https://mp.weixin.qq.com/s/36Jaj79Y8BxFoDB3Bwe7mg

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

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

相关文章

ElasticSearch7.6入门学习笔记

在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发 是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的…

Yolov8-pose关键点检测:模型轻量化设计 | 引入Ghostnet、G_ghost、Ghostnetv2、repghost,进行性能对比

💡💡💡本文解决什么问题:Yolov8-pose关键点评估不同轻量级网络的性能,引入Ghostnet、G_ghost、Ghostnetv2、repghost等网络进行可行性分析 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_63774211/category_12398833.html ✨✨✨手把手教你从数据标记到生…

计算成像最新论文速览 | TPAMI 2023,使用光谱内容隔离非视距成像中的信号

计算成像最新论文速览 | TPAMI 2023,使用光谱内容隔离非视距成像中的信号 注1:本文系“计算成像最新论文速览”系列之一,致力于简洁清晰地介绍、解读计算成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Scien…

Python程序设计基础:函数(一)

文章目录 一、函数的基本概念二、函数的定义和使用1、函数的定义与调用2、函数的参数3、返回多个值 一、函数的基本概念 在使用Python实现某些复杂的功能的时候,容易遇到一些重复率较高的代码,为了代码能够重复使用并提升代码的整洁度,函数这…

【Spring Boot】Spring Boot 集成 RocketMQ 实现简单的消息发送和消费

文章目录 前言基本概念消息和主题相关发送普通消息 发送顺序消息RocketMQTemplate的API介绍参考资料: 前言 本文主要有以下内容: 简单消息的发送顺序消息的发送RocketMQTemplate的API介绍 环境搭建: RocketMQ的安装教程:在官网…

JNI之Java实现蓝牙交互

蓝牙概述 蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间,通过蓝牙设备之间的无线通信实现数据传输,实现数据传输&#xf…

golang代码热加载,热更新库air库实践

windows下先生成air.exe文件,然后移动到golang的执行目录: 2.简介 air是一款基于golang开发的实时热加载工具,通过使用该工具,使得开发人员能专注于coding,而不会被编译过程打断。 项目地址: https://github.com/cos…

【工作中问题解决实践 九】Spring中事务传播的问题排查

最近在工作中遇到了两个关于事务操作的问题,顺便就着这两个问题又回顾了一遍Spring的事务相关的操作,想着一次性把这个问题研究明白了,后续使用事务的时候也能踏实点,让事务发挥真实的作用 什么是事务?什么是事务管理…

【探索Linux】—— 强大的命令行工具 P.2(Linux下基本指令)

前言 前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C的一些知识,也相信大家都掌握的不错,今天博主将会新开一个Linux专题,带领大家继续学习有关Linux的内容。今天第一篇文章博主首先带领大家了解一下…

客服型电话呼叫中心系统,助力企业提升客户服务质量

客服型电话呼叫中心系统是企业客户服务的重要工具之一,它通过电话和网络等方式,为客户提供快速、便捷、高效的服务。客服型电话呼叫中心系统具备自动接听来电、自动路由、管理知识库、录音和监控、生成报表分析等多种功能,有利于企业提高客户…

IP提取器对比器

需求: 一个html 页面 ,有两个输入框 第一个输入框输入文本中包含多个ip,输入的ip是不规则的,需要使用正则表达式提取出 输入文本的ip地址 , 然后在第二个输入框中输入内容,并提取出内容的ip ,如…

实时渲染与传统渲染有啥区别?实时渲染器有哪些

您是否曾经玩过 3D 视频游戏,或观看过让您感觉身处真实的建筑环境?如果是,那么您已经体验过实时渲染。和传统的渲染有什么不同吗?在本文中了解有关实时渲染的所有信息。 什么是实时渲染? 为了更容易理解什么是实时渲…

jupyter文档转换成markdown

背景 上一篇文章**《如何优雅地用python生成模拟数据》**我就使用jupyter写的,这个真的是万能的,可以插入markdown格式的内容,也可写代码,关键是像ipython一样,可以分步执行。 我可以这样自由的写我的博客内容&#x…

Docker入门——保姆级

Docker概述 ​ —— Notes from WAX through KuangShen 准确来说,这是一篇学习笔记!!! Docker为什么出现 一款产品:开发—上线 两套环境!应用环境如何铜鼓? 开发 – 运维。避免“在我的电脑…

【Groups】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题,本文将稍作更改,以便能够顺利运行。 1 Dendrogram 树状图根据给定的距离度量将相似的点组合在一起,并根据点的相似性将它们组织成树状的链接。 新建文件Dendrogram.py: …

怎样在pdf上直接修改?看看这几种修改方法

怎样在pdf上直接修改?PDF是一种非常流行的文件格式,它在保持文档格式不变的同时也可以压缩文件大小,便于分享。尽管 PDF 文件很便捷,但是在 PDF 上进行修改却是一件比较困难的事情。幸运的是,有很多工具可以帮助你在 P…

AUTOSAR笔记2:AP主要模块

1 CM CM(Communication Management)组件提供独立于网络和协议的应用间通信服 务,支持如下功能: 服务发现,包括服务注册、服务查找等;应用间通信,支持单向数据收发(Event&#xff0…

STM32入门——定时器

内容为江科大STM32标准库学习记录 TIM简介 TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时&…

TFTP 的使用操作指南(轻松入门版)

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

springCache-缓存

SpringCache 简介:是一个框架,实现了基于注解的缓存功能,底层可以切换不同的cache的实现,具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术,如使用的redis,需要导入redis的依赖包 基于map缓存 …