MySQL存储引擎初探

MySQL存储引擎初探

目录:

1、存储引擎介绍

2、InnoDB及MyISAM性能对比

3、MyISAM和InnoDB的锁对比

4、两种存储引擎索引对比


存储引擎介绍

说明:基于5.7.19的mysql数据库。

MySQL存储引擎初探 

图1.1 数据库版本

在Navicat for MySQL中进行测试:

输入sql:show engines;

MySQL存储引擎初探 

图1.2 存储引擎类别

参数说明:

Engine:存储引擎名称

Support:MySQL是否支持该引擎

Comment:对该引擎的说明

Transaction:是否支持事务处理

XA:是否分布式交易处理XA规范

Savepoints:是否支持保存点,以便事务回滚到保存点

 

InnoDB

适用于高性能和事务处理环境,支持外键,默认的存储引擎,“拆包即用”。

MyISAM

适用于以只读为主的数据仓库、电子商务和企业应用中。MyISAM使用高级缓存和索引机制提高数据检索和索引速度,但不支持事务,不支持外键。

Blackhole

适用于测试应用程序确实在写数据而又不希望在磁盘上存储任何数据的场景。Blackhole存储引擎满足一个特定的需求,如果启用了二进制日志,SQL语句将被写入日志,将Blackhole存储引擎作为复制拓扑中的中继或代理。在这种情况下,中继代理处理来自master的数据,并将这些数据发送到它的slave上去,但是它本身并不存储任何数据。

CSV

适用于写CSV日志文件,将结构化业务数据快速导入电子表格。CSV存储引擎以表格形式创建、读取和写入逗号分隔值(CSV)文件。不提供任何索引机制,在存储和转换日期时间值时也存在某些问题,存储数据的效率不高,因此应该谨慎使用。

Memory

适用于频繁访问而很少更改的静态数据的情况,例如邮编列表、省市区列表、分类列表等等,以及适用于利用快照技术访问分布数据或历史数据的数据库。Memory(有时被称为HEAP)是内存中的存储器,使用哈希机制检索频繁使用的数据,从而检索更快。由于数据存储在内存中,只在MySQL会话中有效,关机时数据被刷新并删除。

Federated

适用于分布式或数据集环境。Federated存储引擎允许将多个数据库服务器的表连接起来。它不移动数据,也不要求远程表适用相同的存储引擎。目前Federated存储引擎在MySQL的大部分发行版中是禁用的。

Archive

适用于存储和检索大量的很少访问的存档或历史数据。Archive存储引擎以压缩格式存储大量数据,不支持索引,只能通过表扫描访问。

MRG_MYISAM

适用于非常大的数据库应用,如数据仓库,其中数据存储在一个或多个数据库的多个表中。MRG_MYISAM存储引擎的最优的特点就是快速,它将一个大表分割成许多不同的小表,存储在不同的磁盘上,把这些小表合并,然后同时访问它们,搜索和排序执行得更快,因为每个小表需要管理的数据变少了。

缺点:

l 必须使用相同的MyISAM表组成一个合成表;

l 替换操作不可用;

l 索引比单表的索引效率低。

InnoDB及MyISAM性能对比

说明:测试表中含有36个字段,并含有988218条记录

InnoDB存储引擎的测试数据库名为Innodbtest,其中含有该表,表名为Innodbtable;MyISAM存储引擎的测试数据库名为Myisamtest,其中含有该表,表名为Myisamtable。

在MySQL中分别使用InnoDB及MyISAM存储引擎对该表进行测试,首先进行前期工作:

(1)将测试MyISAM存储引擎的表的存储引擎从默认的InnoDB修改为MyISAM:

alter table myisamtable engine=myisam;

 MySQL存储引擎初探

图2.1 修改存储引擎

(2)修改数据库的字符编码,将其设置为utf-8

alter database myisamtest character set utf8;alter database innodbtest character set utf8;

 MySQL存储引擎初探

图2.2 修改InnoDB存储引擎测试库字符编码

 MySQL存储引擎初探

图2.3 修改MyISAM存储引擎测试库字符编码

对两种存储引擎的一些特性进行测试:

l 存储结构

(1)InnoDB:

表数据都保存在一个大小为1.21GB的数据文件中——Innodbtable.ibd,与表相关的元数据信息存放在innodbtable.frm文件中,包括表结构的定义信息。db.opt中定义了数据库的一些定义信息。

 MySQL存储引擎初探

图2.4 InnoDB磁盘存储目录

 MySQL存储引擎初探

图2.5 db.opt文件内容

(2)MyISAM:

.frm文件:存储与表相关的元数据信息,包括表结构的定义信息等;

.MYD文件:大小为853.34MB,存放MyISAM表的数据。

.MYI文件:大小为34.11MB,存放MyISAM表的索引相关信息。

db.opt:定义了数据库的一些定义信息。

 MySQL存储引擎初探

图2.6 MyISAM磁盘存储目录

 MySQL存储引擎初探

图2.7 db.opt文件内容

l select

(1)InnoDB:

 MySQL存储引擎初探

图2.8 InnoDB的select测试

(2)MyISAM:

MySQL存储引擎初探

图2.9 MyISAM的select测试

l insert

(1)InnoDB:

 MySQL存储引擎初探

图2.10 InnoDB的insert测试

(2)MyISAM:

 MySQL存储引擎初探

图2.11 MyISAM的insert测试

l update

SDCMS-B2C商城网站管理系统 SDCMS-B2C商城网站管理系统

SDCMS-B2C商城网站管理系统是一个以php+MySQL进行开发的B2C商城网站源码。 本次更新如下: 【新增的功能】 1、模板引擎增加包含文件父路径过滤; 2、增加模板编辑保存功能过滤; 3、增加对统计代码参数的过滤 4、新增会员价设置(每个商品可以设置不同级不同价格) 5、将微信公众号授权提示页单独存放到data/wxtemp.php中,方便修改 【优化或修改】 1、修改了check_b

SDCMS-B2C商城网站管理系统 13 查看详情 SDCMS-B2C商城网站管理系统

(1)InnoDB:

 MySQL存储引擎初探

图2.12 InnoDB的update测试

(2)MyISAM:

 MySQL存储引擎初探

图2.13 MyISAM的update测试

l delete

(1)InnoDB:

 MySQL存储引擎初探

图2.14 InnoDB的delete测试

(2)MyISAM:

MySQL存储引擎初探

图2.15 MyISAM的delete测试

l delete where

(1)InnoDB:

 MySQL存储引擎初探

图2.16 InnoDB的delete where测试

(2)MyISAM:

MySQL存储引擎初探

图2.17 MyISAM的delete where测试

l count without where

(1)InnoDB:

 MySQL存储引擎初探

图2.18 InnoDB的count without where测试

(2)MyISAM:

MySQL存储引擎初探

图2.19 MyISAM的count without where测试

l group by

(1)InnoDB:

 MySQL存储引擎初探

图2.20 InnoDB的group by测试

(2)MyISAM:

MySQL存储引擎初探

图2.21 MyISAM的group by测试

l 外键

创建一个新表,将测试表的主键作为新表的外键进行测试:

create table `foreigntest`(`id` int primary key not null,`taskid` varchar(64) not null,`host` varchar(128) not null default '',`month` char(8) not null,constraint `fk_task_h_m` foreign key (`taskid`,`host`,`month`)references `innodbtable`(`taskid`,`host`,`month`)) charset=utf8mb4

(1)InnoDB:

 MySQL存储引擎初探

图2.22 InnoDB的外键测试

(2)MyISAM:

 MySQL存储引擎初探

图2.23 MyISAM的外键测试

 

总结如下表:

 

InnoDB

MyISAM

存储结构

.ibd:存放表数据;

.frm文件:存储与表相关的元数据信息,包括表结构的定义信息等;

基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

每个表在磁盘上存储成三个文件:

.MYD文件:存放表的数据。

.MYI文件:存放表的索引相关信息。

.frm文件:存储与表相关的元数据信息,包括表结构的定义信息等;

存储空间

InnoDB的表需要更多的内存和磁盘存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

MyISAM可被压缩,存储空间较小。

可移植性

免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对困难了

由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作

事务安全

支持事务,具有事务(commit)、回滚(rollback)和崩溃修复能力

不支持事务,每次查询具有原子性

更优(0.15秒)

(0.40秒)

删(带where)

(32.79秒)

更优(16.51秒)

全删

(263.86秒)

更优(0.24秒)

(0.20秒)

更优(0.12秒)

(139.75秒)

更优(65.57秒)

支持表锁、行锁,行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

只支持表锁

外键

支持

不支持

count without where

没有保存表的具体行数,需要逐行扫描统计(70.88秒)

更优,因为MyISAM保存了表的具体行数,只需简单读出。(0.09秒)

group by

(35.14秒)

更优(4.75秒)

附注:

[1]表空间:InnoDB用来组织与机器无关的文件的工具,包括数据、索引及回滚机制。默认情况下,所有表共享一个表空间(称为共享表空间)。共享表空间不会自动扩展成多个文件。默认情况下,一个表空间只占据单个文件,该文件随数据增加而增长。使用autoextend选项可以允许表空间创建新的文件。

[2]崩溃修复能力:InnoDB存储引擎使用两种基于磁盘的机制存储数据,即日志文件和表空间。在关机或死机之前,InnoDB会使用这些日志来重建数据恢复。在程序启动时,InnoDB读取日志并自动将脏页写入磁盘,从而在系统崩溃前恢复缓冲中的更新。

MyISAM和InnoDB的锁对比

(1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

(3)对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写请求;MyISAM表的读和写操作之间,以及写和写操作之间是串行的(当一线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。)

(4)共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

(5)排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。

(6)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁。

两种存储引擎索引对比

l InnoDB:

l 在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

l InnoDB表使用的索引是聚集索引。聚集索引是一种数据结构,不仅存储索引,也存储数据本身。因此,一旦定位到索引中的某个值,就可以直接检索数据而无需额外的磁盘寻道。

l 主键索引或者表的第一个索引都采用聚集索引创建。

l InnoDB的所有辅助索引都引用主键作为data域。如果如果创建了辅助索引,聚集索引的关键字(主键、唯一键或行ID)也会存在辅助索引中,这样可以快速按照关键字查找和快速获取聚集索引中的原始数据。也就是如果使用主键列扫描辅助索引,则查询只需要用辅助索引就可以获取数据。

l MyISAM:

l 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。使用B+树作为索引结构,叶节点的data域存放的是数据记录的地址。

l 在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

 

l 主要区别:

l 主索引的区别:InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

l 辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

附注:

B+树:对于一棵m阶B+树,具有如下特点:

l 有n棵子树的节点中含有n个关键字。

l 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针。且叶子结点本身依照关键字的大小自小而大顺序链接。

l 所有的非终端结点可以看成索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。

l 在B+树,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。

l 树中每个结点最多含有m棵子树。

 

以上就是MySQL存储引擎初探的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/787985.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CentOS系统下PyTorch安装失败怎么办
上一篇 2025年11月26日 13:05:45
百度极速版如何关闭广告推送_百度极速版广告管理的设置方法
下一篇 2025年11月26日 13:06:16

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    100
  • 获取日期中的周数:CodeIgniter 教程

    本教程旨在帮助开发者在 CodeIgniter 框架中,从日期字符串中准确提取周数。我们将使用 PHP 内置的 DateTime 类,并提供详细的代码示例和注意事项,确保您能够轻松地在项目中实现此功能。 使用 DateTime 类获取周数 PHP 的 DateTime 类提供了一种便捷的方式来处理日…

    2026年5月10日
    000
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 《魔兽世界》将于6月11日开启国服回归技术测试

    《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试

    《%ign%ignore_a_1%re_a_1%》官方宣布,将于6月11日开启国服回归技术测试,时间为7天,并称可以在6月内正式开服,玩家们可以访问官网下载战网客户端并预下载“巫妖王之怒”客户端,技术测试详情见下图。 WordAi WordAI是一个AI驱动的内容重写平台 53 查看详情 以上就是《…

    2026年5月10日 用户投稿
    200
  • php常量怎么用_PHP常量(define/const)定义与使用方法

    PHP中可通过define函数和const关键字定义常量,用于存储不可变值。define适用于全局作用域,支持动态名称和条件定义,如define(‘SITE_NAME’, ‘MyWebsite’);const在编译时生效,语法简洁但限制多,只能在类或全…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    000
  • 创建指定大小并填充特定数据的Golang文件教程

    本文将介绍如何使用Golang创建一个指定大小的文件,并用特定数据填充它。我们将使用 `os` 包提供的函数来创建和截断文件,从而实现快速生成大文件的目的。示例代码展示了如何创建一个10MB的文件,并将其填充为全零数据。掌握这些方法,可以方便地在例如日志系统或磁盘队列等场景中,预先创建测试文件或初始…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • 使用 WebCodecs VideoDecoder 实现精确逐帧回退

    本文档旨在解决在使用 WebCodecs VideoDecoder 进行视频解码时,实现精确逐帧回退的问题。通过比较帧的时间戳与目标帧的时间戳,可以避免渲染中间帧,从而提高用户体验。本文将提供详细的解决方案和示例代码,帮助开发者实现精确的视频帧控制。 在使用 WebCodecs VideoDecod…

    2026年5月10日
    000
  • PHP动态生成表单输入与POST数据获取实践指南

    本教程详细阐述了如何在php中根据动态数据源(如数据库值)生成多个表单输入框,并演示了如何通过post方法准确无误地获取这些动态生成的输入值。文章强调了正确的输入框命名策略,避免了常见的命名误区,并提供了完整的代码示例,确保开发者能够高效处理动态表单数据。 动态生成表单输入 在Web开发中,我们经常…

    2026年5月10日
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • Debian Copilot的社区活跃度如何

    debian copilot是codeberg社区维护的ai助手,旨在为debian用户提供服务。尽管搜索结果中没有直接提供关于debian copilot社区支持活跃度的具体数据,但我们可以通过debian社区的整体活跃度和特点来推断其活跃性。 Debian社区的一般情况: Debian拥有详尽的…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信