MySQL 常见存储引擎详解(一)
本篇主要介绍MySQL中常见的存储引擎。
目录
一、InnoDB引擎
简介
特性
最佳实践
创建InnoDB
存储文件
二、MyISAM存储引擎
简介
特性
创建MyISAM表
存储文件
存储格式
静态格式
动态格式
压缩格式
三、MEMORY存储引擎
简介
特点
创建MEMORY表
存储文件
内存管理
一、InnoDB引擎
简介
InnoDB是一款兼具高性能和高可靠性的存储引擎。在MySQL中默认以InnoDB作为存储引擎,在创建表时,如果我们没有指定其它存储引擎作为存储引擎,将默认使用InnoDB作为存储引擎。
特性
InnoDB的主要特点如下:
- InnoDB支持使用事务,事务遵从ACID特性,且事务具有回滚,提交和崩溃恢复的功能,以保护用户的数据。
- InnoDB支持行级锁,能够带来更多的并发。
- InnoDB在内存中维护了一个缓冲池,将常用的数据保存到缓冲池中,如果要使用的数据包含在缓冲池中,则直接从缓冲池中读取,如果不包含则从磁盘中读取并使用,并将从磁盘中读取到的数据保存到缓冲池中,从而减少磁盘IO的次数,从而大大提高SQL的执行性能。
- InnoDB支持使用外键约束,以保证数据的完整性,在进行插入插入,更新,删除时确保关联表之间的一致性。
- 在InnoDB中实现了一个自适应哈希的功能,当某条查询语句被执行多次时,会自动将该语句和执行结果通过Key-value的结构组织起来,下次进行相同的查询时,直接返回查询结果。
最佳实践
下面我们来了解一下如何使用,才能发挥出InnoDB的最佳效果。
- 在表中为查询最频繁的列(或多个列) 指定主键(或复合主键),如果没有合适的列作为主键,则创建一个自增的列作为主键。
- 在多个表根据相同的ID查询数据,建议使用表连接,可以在连接的列上定义外键,并在每个表中使用相同的数据类型来声明这些列,添加外键可以确保被外键引用的列使用索引,从而提高性能。
- 将多个DML操作组合在自己创建的事务中,统一提交或者回滚,以免创建事务过于频繁,(DML操作会自动创建一个事务并自动提交)。
- 由于DML语句自动创建的事务是自动提交的,因此在每秒提交数百次事务的服务器上,应该结合存储设备的写入速度,关闭事务的自动提交,可以通过系统变量autocommit=off设置。
- 不使用Lock Tabel来对表加锁,因为InnoDB可以在不牺牲可靠性和高性能的情况下同时保证对一张表的并发访问。
创建InnoDB
创建InnoDB表的语法如下:
use test_db #选择数据库
create table InnoDB_test(id int primary key auto_increment,name varchar(20)) engine = InnoDB; #创建一个InnoDB表
存储文件
创建的InnoDB表的表空间文件会保存到数据目录中的数据库同名目录中,例如上面创建的这个表的文件就会被保存如下目录中,文件名为 表名.ibd,里面包含了表的具体数据和相关表描述信息。

我们是无法直接该.ibd文件中的表描述信息的,如果需要读取的话,可以使用ibd2sdi工具进行读取,使用方法如下:
ibd2sdi --dump-file=InnoDB_test.txt InnoDB_test.ibd
通过上述命令就能提取我们的.ibd文件中的表描述信息,并在当前目录生成一个我们可以读懂的.txt文件,文件的内容如下:

在MySQL5.x版本以前的版本中会生成一个.frm文件来单独描述表描述信息。
二、MyISAM存储引擎
简介
相对于InnoDB引擎而言,MyISAM引擎的表空间文件占用的空间相对较小,但MyISAM引擎采用的一个表级锁,因此在并发场景下,读写性能相对较低,MyISAM存储引擎通常在中小型web项目以及级数据仓库中的只读或者主要是读的场景中使用。
特性
- MyISAM表中最大可以存放2^64行数据
- 每个MyISAM表中最多可以创建64个索引,每个索引中最多包含16个列
- 支持并发插入
- 可以将数据文件和索引文件放到不同设备的不同目录中,从而提高访问速度
- BLOB和TEXT类型的数据也能够被索引。
- 索引列中允许出现null值
- 可以设置myisam_recover_options系统变量来使mysqld在启动时自动修复上一次没有正确关闭的MyISAM表。
- 表中varchar 和char列总和最多可达64kb
- unique约束的长度不受限制。
创建MyISAM表
在创建MyISAM表需要显示指定使用MyISAM引擎,具体语法如下:
CREATE TABLE myisam_test(id int primary key auto_increment ,name varchar(20))ENGINE = MyISAM [DATA DIRECTORY = PATH][INDEX DIRECTORY = PATH];
其中DATA DIRECTORY和INDEX DIRECTORY表示数据文件和索引文件的绝对地址,我们可以显示指定,不指定则使用默认的数据目录来存放数据文件和索引文件。
存储文件
创建MyISAM表时会根据表名生成三个不同后缀名的文件,分别是.MYD(数据文件)、.MYI(索引文件)、.sdi(表信息描述文件(JSON格式))。这三个文件和InnoDB表的.ibd文件一样,都默认保存在MySQL的数据目录中。
存储格式
MyISAM表支持三种不同的存储格式,其中FIXED(静态格式),和DYNAMIC(动态格式),根据使用的列类型自动选择,而另一种格式,只能使用myisampack实用程序生成并且为只读。
当表中的列不存在BLOB类型和TEXT类型的列时,在使用CREATE TABLE 或者ALTER TABLE语句创建或者修改表时,可以提过ROW_FORMAT将表设置成动态格式或者静态格式。
使用myisamchk可以将压缩格式的MyISAM表进行解压,语法为myisamcnk --uppack.下面我们来具体了解一下这三种存储格式。
静态格式
静态格式是MyISAM表的默认格式,一般在表中不含可变类型(varchar,BLOB,TEXT,varbinary)的列时使用,如果包含且长度小于固定的列宽,则字符串用空格补充到列宽,二进制用0x00字节补充到列宽,因此,静态格式中所有列的长度都是固定的。因为长度固定我们可以直接通过行号和固定行的长度来直接定位到目标行在磁盘的位置,从而增加磁盘访问的速度,除此之外,固定的位置还能让我们在数据损坏时更好的进行恢复,但由于无论可变长度的类型是否达到最长,都会补到最长的列宽,这样会造成一定的空间浪费。另外需要注意的是如果当前类可为null,会用1bit的额外空间来标识当前是否为null。总的来说,静态格式的安全性,访问速度和简易性相对更好,但会带来一些空间浪费。
动态格式
当表中包含可变长度类型的列时,通常使用动态格式,也可以通过ROW_FORMAT = DYNAMIC选项设置。动态格式中,每一行的长度都不是固定的,在每一行中都包含一个标记来指示当前行有多长,如果行因为更新操作而使长度增加,下次如果长度减少,就可能会带来一些空间碎片,可以使用OPTIMIZE TABLE table_name 语句或者myisamcnk -r来整理这些空间碎片。除此之外,在每一行中还包含一个位图,来标识哪些列为空字符串或者值为0,这些被标识的列将不会被保存到磁盘中,因此动态格式的空间占用要小很多,和静态格式一样,会额外用1bit的空间来标识可能为null的列是否为null。使用动态格式时,每一行每一列都可以使用单独的方式来进行压缩,常用的压缩方式如下:
- 如果某列的值为0,无论原来该列为哪种数据类型,都只用一个bit储存
- 如果列中可能出现的不同的值的数量较少,则数据类型转为枚举
- 如果数据取值范围较小,则统一使用更小的数据类型来进行存储,例如一个bigint列,其取值范围只有(-128,127),那么就转用tinyint来存储
总的来说,动态格式的空间占用要比固定格式小很多,但由于不固定的长度,访问速度相对较慢。
压缩格式
对于使用myisampack生成的只读数据表,统一使用压缩格式,压缩格式的特点如下:
- 压缩格式的磁盘占用非常小,实现了最大限度的空间节省
- 适用于固定长度和动态长度的数据行
- 数据只读,不能进行删除和更新等修改操作
三、MEMORY存储引擎
简介
使用MEMORY引擎创建的表,其所有数据都保存到内存中,但由于内存的特殊性,一断机器关闭或者断电都会使数据丢失,因此使用MEMORY存储引擎创建的表一般只用作临时表或者只读的缓存。
特点
MEMORY存储引擎具有如下特点:
- 使用固定长度的存储格式,当列为可变长度类型时,使用固定长度来存储。
- 不能包含BLOB、TEXT类型的列
- 非临时MEMORY表在所有客户端之间共享
- 支持hash索引(默认使用)和B树索引
- 不支持表分区
- 使用单线程来操作表,在高并发的场景下可能会出现较为严重的锁竞争,因此,即使数据保存在内存中,使用MEMORY表的性能不一定比InnoDB高
创建MEMORY表
创建MEMORY表时,需要在建表语句后面显示指定,具体如下:
CREATE TABLE memory_test(id int primary key auto_increment ,name varchar(20))ENGINE = MEMORY
存储文件
由于memory表的所有数据都保存到内存中,因此没有专门的文件用来专门保存数据,只有一个sdi文件来保存表描述信息和数据字典。

内存管理
接下来我们来了解一下MEMORY存储引擎是如何管理内存中的数据时,具体可以总结为以下几点:
- MEMORY存储引擎只有在删除整张表或者删除表中的所有行时才会真的将表中的数据所占用的内存进行回收,如果只是删除单行,不会真的去回收该数据的内存。如果需要回收已删除行的数据,可以使用ALTER TABLE ENGINE = MEMORY来强制对表进行重建。
- 对于表中一行数据所占内存,可以通过下面的公式进行计算 : (所有B树索引长度)SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4) + (所有hash索引的长度)SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2) + (单行数据长度)ALIGN(length_of_row+1, sizeof(char*))。其中,ALIGN函数是使行长度为char类型大小的精确倍数。需要注意的是sizeof(char*)在32位机器上的长度为4,在64位上则为8.
- max_heap_tbale_size系统变量用来设置一张MEMORY表的最大容量,默认为16mb(如果需要修改通常只修改当前会话的值,只有在要确定所有会话表都采用统一的大小时才修改全局的值)
- 每次重启服务器,MEMORY表中的数据将全部被清楚,其数据永远不会写入磁盘持久化保存
相关文章:
MySQL 常见存储引擎详解(一)
本篇主要介绍MySQL中常见的存储引擎。 目录 一、InnoDB引擎 简介 特性 最佳实践 创建InnoDB 存储文件 二、MyISAM存储引擎 简介 特性 创建MyISAM表 存储文件 存储格式 静态格式 动态格式 压缩格式 三、MEMORY存储引擎 简介 特点 创建MEMORY表 存储文件 内…...
Leetcode 股票买卖
买卖股票最佳时机 I II 不限制交易次数 prices [7,1,5,3,6,4] 启发思路:最后一天发生了什么? 从第0天到第5天结束时的利润 从第0天到第4天结束时的利润 第5天的利润 (第5天的利润:0/-4/4) 关键词:天…...
小白学习手册:轻松理解MQ消息队列
目录 # 开篇 RabbitMQ介绍 通讯概念 1. 初始MQ及类型 2. MQ的架构 2.1 RabbitMQ的结构和概念 2.2 RabbitMQ消息流示意图 3. MQ下载使用 3.1 Docker下载MQ参考 3.2 进入RabbitMQ # 开篇 MessagesQueue 是一个抽象概念,用于描述消息队列系统的一般特性和功能…...
electron线上更新
一、安装electron-updater npm install --save electron-updater二、在main.js中引入使用 import { autoUpdater } from electron; if (!isDev) {const serverUrl https://your-update-server.com; // 自定义更新服务器地址或GitHub Releases地址autoUpdater.setFeedURL(${…...
谈谈检测浏览器类型
前几天被问到如何检测浏览器类型,我突然发现我对此并不了解,之前的项目中也没有使用到过,只隐约记得通过一个自带的方法即可获取。所以今天特意来仔细补习一下。 核心:navigator.userAgent 1.正则表达式 2.引用外部库 3.判断浏…...
Django 和 Django REST framework 创建对外 API
1. 环境准备 确保你已经安装了 Python 和 Django。如果尚未安装 Django REST framework,通过 pip 安装它: pip install djangorestframework 2. 创建 Django 项目 如果你还没有 Django 项目,可以通过以下命令创建: django-ad…...
数据结构之“刷链表题”
🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…...
复分析——第9章——椭圆函数导论(E.M. Stein R. Shakarchi)
第 9 章 椭圆函数导论 (An Introduction to Elliptic Functions) The form that Jacobi had given to the theory of elliptic functions was far from perfection; its flaws are obvious. At the base we find three fundamental functions sn, cn and dn. These functio…...
使用kubeadm安装k8s并部署应用
安装k8s 1. 准备机器 准备三台机器 192.168.136.104 master节点 192.168.136.105 worker节点 192.168.136.106 worker节点2. 安装前配置 1.基础环境 ######################################################################### #关闭防火墙: 如果是云服务器&…...
springMVC学习
概述 Spring MVC(Model-View-Controller,模型-视图-控制器)是Spring框架的一部分,用于构建基于Java的Web应用程序。它遵循MVC设计模式,分离了应用程序的不同方面(输入逻辑、业务逻辑和UI逻辑)&…...
深入探讨光刻技术:半导体制造的关键工艺
前言 光刻(Photolithography)是现代半导体制造过程中不可或缺的一环,它的精度和能力直接决定了芯片的性能和密度。本文将详细介绍光刻技术的基本原理、过程、关键技术及其在半导体制造中的重要性。 光刻技术的基本原理 光刻是一种利用光化…...
CesiumJS【Basic】- #042 绘制纹理线(Primitive方式)
文章目录 绘制纹理线(Primitive方式)1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Primitive方式) 1 目标 使用Primitive方式绘制纹理线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var...
代码随想录第38天|动态规划
1049. 最后一块石头的重量 II 参考 备注: 当物体容量也等同于价值时, 01背包问题的含义则是利用好最大的背包容量sum/2, 使得结果尽可能的接近或者小于 sum/2 等价: 尽可能的平分成相同的两堆, 其差则为结果, 比如 (abc)-d, (ac)-(bd) , 最终的结果是一堆减去另外一堆的和, 问…...
java生成excel,uniapp微信小程序接收excel并打开
java引包,引的是apache.poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency> 写一个测试类,把excel输出到指定路径 public s…...
sam_out 目标检测的应用
缺点参考地址训练验证模型解析 缺点 词表太大量化才可 参考地址 https://aistudio.baidu.com/projectdetail/8103098 训练验证 import os from glob import glob import cv2 import paddle import faiss from out_yolo_model import GPT as GPT13 import pandas as pd imp…...
VLAN原理与配置
AUTHOR :闫小雨 DATE:2024-04-28 目录 VLAN的三种端口类型 VLAN原理 什么是VLAN 为什么使用VLAN VLAN的基本原理 VLAN标签 VLAN标签各字段含义如下: VLAN的划分方式 VLAN的划分包括如下5种方法: VLAN的接口链路类型 创建V…...
使用Spring Boot实现RESTful API
使用Spring Boot实现RESTful API 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何利用Spring Boot框架实现RESTful API,这是现…...
中英双语介绍美国常春藤联盟( Ivy League):八所高校
中文版 常春藤联盟简介 常春藤联盟(Ivy League)是美国东北部八所私立大学组成的高校联盟。虽然最初是因体育联盟而得名,但这些学校以其学术卓越、历史悠久、校友杰出而闻名于世。以下是对常春藤联盟的详细介绍,包括其由来、成员…...
【计算机网络】常见的网络通信协议
目录 1. TCP/IP协议 2. HTTP协议 3. FTP协议 4. SMTP协议 5. POP3协议 6. IMAP协议 7. DNS协议 8. DHCP协议 9. SSH协议 10. SSL/TLS协议 11. SNMP协议 12. NTP协议 13. VoIP协议 14. WebSocket协议 15. BGP协议 16. OSPF协议 17. RIP协议 18. ICMP协议 1…...
java实现http/https请求
在Java中,有多种方式可以实现HTTP或HTTPS请求。以下是使用第三方库Apache HttpClient来实现HTTP/HTTPS请求的工具类。 优势和特点 URIBuilder的优势在于它提供了一种简单而灵活的方式来构造URI,帮助开发人员避免手动拼接URI字符串,并处理参…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
