首页 > 数据库 >MySQL的数据在磁盘上如何存储?

MySQL的数据在磁盘上如何存储?

时间:2024-06-04 18:27:10浏览次数:28  
标签:存储 索引 InnoDB MyISAM MySQL 磁盘 数据

存储引擎


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

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

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

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

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

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

主要区别

|

| MyISAM | InnoDB |

| --- | --- | --- |

| 事务 | 不支持❌ | 支持 |

| 表/行锁 | 只有表锁 | 还引入了行锁 |

| 外键 | 不支持❌ | 支持✔ |

| 全文索引 | 支持✔ | 版本5.6 开始支持 |

| 读写速度 | 更快 | 更慢 |

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

相关命令

MyISAM

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

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

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

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

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

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

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

底层查找过程:

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

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

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

InnoDB

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

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

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

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

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

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

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

底层查找过程:

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

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

聚集(聚簇)索引


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

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

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

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

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


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

标签:存储,索引,InnoDB,MyISAM,MySQL,磁盘,数据
From: https://www.cnblogs.com/liftsail/p/18231438

相关文章

  • MySQL 查找并删除重复行
    本文讲述如何查找数据库里重复的行。这是初学者十分普遍遇到的问题。方法也很简单。这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysqlIRC频道问到的问题)如何查找重复行第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一......
  • spring boot mybatis mysql 对emoji表情的插入与查询支持
    在网上查了很多都是要求在数据层面修改比如userName字段的值有可能存emoji表情那就把字段改成字符集 utf8mb4我的排序规则是utf8mb4_unicode_ci,如果单个字段不行就整个表varchar字段都改成这样的到了这部,使用mysql客户端对这个字段增删改查是没问题的但是很少有人提到myb......
  • 计算机组成原理·虚拟存储器页式段式和段页式
    虚拟存储器·页式·段式·段页式主存和辅存共同构成了虚拟存储器,在硬件和系统软件的共同管理下工作。对于程序员而言,虚拟存储器是透明的,将主存和辅存的地址空间统一编址用户编程允许涉及的地址称为虚地址或逻辑地址,虚拟地址对应的是存储空间称为虚拟空间实际的主存单元地址称为......
  • MySQL数据库:Lock wait timeout exceeded; try restarting transaction问题解析及解决方
    MySQL数据库:Lockwaittimeoutexceeded;tryrestartingtransaction问题解析及解决方案一、背景描述二、原因分析三、解决方案3.1方案一事务信息查询3.2方案二如果杀掉线程依然不能解决,可以查找执行线程耗时比较久的任务,kill掉3.3方案三innodb_lock_wait_timeout锁定等......
  • MySQL数据库的安装
    MySQL数据库的安装【一】各种数据库的端口MySQL:3306Redis:6379MongoDB:27017Django:8000flask:5000【二】MySQL介绍MySQL是一个开源免费的关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下公司。MySQL最流行的关系型数据库管理系统,在WEB......
  • 配置Mysql允许远程连接
    目录1.开通其他主机使用root登录的权限2.在安装mysql的本机上添加防火墙允许规则,允许33063.补充1.开通其他主机使用root登录的权限在搜索里搜索msyql进入命令行,输入密码;usermysql showtables;显示所有数据库,我们可以看到有一个名为user的表。selectHost,Use......
  • 新增磁盘扩容到根目录
    新增磁盘扩容到根目录在工作中遇到服务器磁盘空间不足是比较常见的,如何解决此问题,最简单,最直接的方法就是扩容。现服务器大多以Linux为主,本文以vmware下的centos7新增加了一块硬盘的场景进行介绍。此处举例新增的一块磁盘名称为/dev/sdb操作思路(括号中是用到的命令):查看磁盘......
  • windows MySql 8免安装初并始化root权限和密码
    安装命令@ECHOOFFif"%1"=="h"gotobeginstartmshtavbscript:createobject("wscript.shell").run("""%~nx0""h",0)(window.close)&&exit:beginfltmc>nul||cd/d%~dp0&&mshtavbscript:......
  • Mysql实时数据监听高可用
    一、需求:数据实时监听在项目中有着重要的意义,例如某些项目需要监听数据库的变化,生成对应的元数据块,这个数据块为前端接口提供数据支撑或者数据计算使用,监听到某些数据的变化,及时提醒上游或下游服务等等。如何保证数据监听的高可用?本文用自身项目结构简易阐述,不喜勿喷。二、......
  • 适合小白学习的项目1901java体育馆管理系统Myeclipse开发mysql数据库web结构java编程
    一、源码特点java体育馆管理系统是一套完善的web设计系统,对理解JSPjava编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。java体育馆管理系......