当前位置: 首页 > news >正文

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引包&#xff0c;引的是apache.poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency> 写一个测试类&#xff0c;把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 &#xff1a;闫小雨 DATE&#xff1a;2024-04-28 目录 VLAN的三种端口类型 VLAN原理 什么是VLAN 为什么使用VLAN VLAN的基本原理 VLAN标签 VLAN标签各字段含义如下&#xff1a; VLAN的划分方式 VLAN的划分包括如下5种方法&#xff1a; VLAN的接口链路类型 创建V…...

使用Spring Boot实现RESTful API

使用Spring Boot实现RESTful API 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot框架实现RESTful API&#xff0c;这是现…...

中英双语介绍美国常春藤联盟( Ivy League):八所高校

中文版 常春藤联盟简介 常春藤联盟&#xff08;Ivy League&#xff09;是美国东北部八所私立大学组成的高校联盟。虽然最初是因体育联盟而得名&#xff0c;但这些学校以其学术卓越、历史悠久、校友杰出而闻名于世。以下是对常春藤联盟的详细介绍&#xff0c;包括其由来、成员…...

【计算机网络】常见的网络通信协议

目录 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中&#xff0c;有多种方式可以实现HTTP或HTTPS请求。以下是使用第三方库Apache HttpClient来实现HTTP/HTTPS请求的工具类。 优势和特点 URIBuilder的优势在于它提供了一种简单而灵活的方式来构造URI&#xff0c;帮助开发人员避免手动拼接URI字符串&#xff0c;并处理参…...

sendDefaultImpl call timeout(rocketmq)

rocketmq 连接异常 senddefaultimpl call timeout-腾讯云开发者社区-腾讯云 第一种情况&#xff1a; 修改broker 的配置如下&#xff0c;注意brokerIP1 这个配置必须有&#xff0c;不然 rocketmq-console 显示依然是内网地址 caused by: org.apache.rocketmq.remoting.excep…...

数据通信与计算机网络——数据与信号

主要内容 模拟与数字 周期模拟信号 数字信号 传输减损 数据速率限制 性能 注&#xff1a;数据必须被转换成电磁信号才能进行传输。 一、模拟与数字 数据以及表示数据的信号可以使用模拟或者数字的形式。数据可以是模拟的也可以是数字的&#xff0c;模拟数据是连续的采用…...

使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中

使用VuePress2.X构建个人知识博客&#xff0c;并且用个人域名部署到GitHub Pages中 什么是VuePress VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容&#xff08;如文档、博客等&#xff09;&#xff0c;然后 VuePress 会帮助你生成一个…...

从golang的sync.pool到linux的slab分配器

最近学习golang的时候&#xff0c;看到golang并发编程中有一个sync.pool&#xff0c;即对象池&#xff0c;猛地一看这不跟linux的slab分配器类似嘛&#xff0c;赶紧学习记录下 这里先总结下设计sync.pool和slab的目的 sync.pool 为了缓解特定类型的对象频繁创建和销毁&#x…...

重构城市应急指挥布控策略 ——无人机智能视频监控的破局之道

在突发事件、高空巡查、边远区域布控中&#xff0c;传统摄像头常常“看不到、跟不上、调不动”。无人机智能视频监控系统&#xff0c;打破地面视角局限&#xff0c;以“高空布控 AI分析 实时响应”赋能政企单位智能化管理。在城市应急指挥中心的大屏上&#xff0c;一场暴雨正…...

# STM32F103 SD卡读写程序

下面是一个基于STM32F103系列微控制器的SD卡读写完整程序&#xff0c;使用标准外设库(StdPeriph)和FatFs文件系统。 硬件准备 STM32F103C8T6开发板(或其他F103系列)SD卡模块(SPI接口)连接线缆 硬件连接 SD卡模块 STM32F103 CS -> PA4 (SPI1_NSS) SCK -> PA5 (SPI…...

1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server

以下为本次问题的解决办法&#xff1a; 1、暂停mysql容器&#xff1a; docker stop mysql 2、删除mysql容器&#xff1a;docker rm mysql 3、查看mysql容器是否被删除&#xff1a;docker ps -a #没有mysql容器就是删除成功 4、run mysql容器&#xff1a; docker run -d --…...

[Spring]-AOP

AOP场景 AOP: Aspect Oriented Programming (面向切面编程) OOP: Object Oriented Programming (面向对象编程) 场景设计 设计: 编写一个计算器接口和实现类&#xff0c;提供加减乘除四则运算 需求: 在加减乘除运算的时候需要记录操作日志(运算前参数、运算后结果)实现方案:…...

测试W5500的第11步_使用ARP解析IP地址对应的MAC地址

本文介绍了基于W5500芯片的ARP协议实现方法&#xff0c;详细阐述了ARP请求与回复的工作机制。ARP协议通过广播请求和单播回复实现IP地址与MAC地址的映射&#xff0c;确保局域网设备间的可靠通信。文章提供了完整的STM32F10x开发环境下的代码实现&#xff0c;包括网络初始化、SP…...

物联网嵌入式开发实训室建设方案探讨(高职物联网应用技术专业实训室建设)

一、建设背景与目标 在当今数字化时代&#xff0c;物联网技术正以前所未有的速度改变着人们的生活和工作方式。从智能家居到工业自动化&#xff0c;从智能交通到环境监测&#xff0c;物联网的应用场景无处不在。根据市场研究机构的数据&#xff0c;全球物联网设备连接数量预计…...