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

这篇具有很好参考价值的文章主要介绍了MySQL两种存储引擎及索引对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

MySQL是怎么存储数据的呢?

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

存储引擎

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

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


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

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

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

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

主要区别

MyISAM InnoDB
事务 不支持❌ 支持
表/行锁 只有表锁 还引入了行锁
外键 不支持❌ 支持✔
全文索引 支持✔ 版本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 文件夹中,也可以自己修改。

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

下面我创建了以 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='测试用户表';

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

底层查找过程

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

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


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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

存储引擎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='测试用户表';

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

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

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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

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

底层查找过程

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

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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

其他存储引擎:

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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

索引

聚集(聚簇)索引

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

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

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

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

二级索引

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

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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

底层查找过程

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

MySQL两种存储引擎及索引对比,基础学习,面试,mysql,数据库

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

常见面试题

为什么 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文章来源地址https://www.toymoban.com/news/detail-636764.html

到了这里,关于MySQL两种存储引擎及索引对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 索引、事务与存储引擎

    ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 ●使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数

    2024年02月08日
    浏览(29)
  • MySQL索引、事务、事务与存储引擎

    1、索引 1.1 索引的概念                                                                                                                                    ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似

    2024年02月07日
    浏览(33)
  • MySQL强制使用索引的两种方式及优化索引,使用MySQL存储过程创建测试数据。

    一、MySQL强制使用索引的两种方式 1、使用 FORCE INDEX 语句: 使用 FORCE INDEX(索引名称)走索引: 2、使用 USE INDEX 语句: 使用 USE INDEX(索引名称)走索引: FORCE INDEX 或 USE INDEX 的区别? FORCE INDEX :这个语句指示MySQL强制查询使用特定的索引。它会忽略优化器的选择,无论索引

    2024年02月03日
    浏览(39)
  • 第9步---MySQL的索引和存储引擎

    1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和b+tree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 b+tree树 基于树的结构 左边的数据都是比较大的 中间的是相似

    2024年02月11日
    浏览(29)
  • 【MYSQL篇】mysql不同存储引擎中索引是如何实现的?

    不同的存储引擎文件是不一样,我们可以查看数据文件目录: 每 张 InnoDB 的 表 有 两 个 文 件 ( .frm 和 .ibd ), MyISAM 的 表 有 三 个 文 件 (.frm、.MYD、.MYI)。 有一个是相同的文件 .frm , .frm 是 MySQL 里面表结构定义的文件,不管你建表的时候选用任何一个存储引擎都会生成

    2024年02月09日
    浏览(30)
  • 什么是聚簇索引和非聚簇索引?它们有什么区别?MySQL支持哪些存储引擎?

    聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是数据库中两种不同类型的索引结构,它们在存储和组织数据上有所不同。 聚簇索引: 聚簇索引是按照索引列的顺序重新组织数据的方式。它定义了表的物理排序方式,使得数据行按照索引列的顺序存储在磁盘上相邻

    2024年04月26日
    浏览(37)
  • MySQL高级篇复盘笔记(一)【存储引擎、索引、SQL优化、视图、触发器、MySQL管理】

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 连接层

    2024年02月06日
    浏览(56)
  • MySQL 基础面试题02(事务&索引)

    1.什么是 MySQL 事务? MySQL 事务是指一组操作,是一个不可分割的工作单位,可以确保一组数据库操作要么全部执行,要么全部不执行。换句话说,事务是 MySQL 中保证数据一致性和完整性的机制。 在 MySQL 中,事务可以用来保证数据库中数据的一致性和完整性,例如在向数据库

    2024年02月12日
    浏览(25)
  • 索引 事务 存储引擎

    ################索引##################### 一、索引的概念 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 ●使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引

    2024年02月10日
    浏览(25)
  • 【MySQL】MySQL索引优化——从原理分析到实践对比

    目录 使用TRACE分析MySQL优化 开启TRACE TRACE 结果集 ORDER BY GROUP BY 优化 优化方式 分页优化 不同场景的优化方式 JOIN关联优化 算法介绍 优化方式 COUNT优化 优化方式 某些情况下,MySQL是否走索引是不确定的=[,,_,,]:3,那、我就想确定。。。咋办? 首先,在 FROM 表名 后加上 FORCE IN

    2023年04月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包