说说关于MySQL的存储引擎的那些事!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 和大多数的数据库不同,MySQL中有一个存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎。存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎就是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

一、概念


和大多数的数据库不同,MySQL中有一个存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎。存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎就是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。


对于存储引擎的概念百度百科是这样介绍的:MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。


通俗点说也就是同一个数据库如果使用不同的功能(比如存储文件的类型、是否需要支持事务等等),则需要选择对应的存储引擎,来提升存储的性能。这里的存储引擎就好比发动机,如果是一辆轿车(数据库),平时只是上下班用来跑通勤,那么普通的发动机引擎(存储引擎)即可,但是也有发烧友喜欢改装汽车,给它装上跑车的发动机引擎,这样的话功能和用途又是不一样的。


Orcal、SqlServer等数据库只有一种存储引擎,而MySQL提供了插件式的存储引擎架构,所以MySQL支持多种存储引擎,可以根据需要使用相应的引擎,或者开发者可以自己编写存储引擎。


MySQL5.0开始支持的存储引擎有很多,比如:InnoDB、BDB、Memory、Merge、Example、Archive 、CSV,Blackhole、Federated等等,其中InnoDBh和BDB是提供事务安全表,而其他的存储引擎是非事务安全表。


可以通过下面的命令来查看当前数据库支持的存储引擎


查看支持的存储引擎
show engines;
查看默认的存储引擎
show variables like ‘storage_engine’
复制代码


192b62f94da248819974461a4fe2ce61~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp (1).jpg


这里可以看到MySQL数据库默认支持的存储引擎是InnoDB,如果在创建新表的时候不指定存储引擎,那么系统就会使用默认的存储引擎,MySQL5.5之前默认的存储引擎是MyISAM,5.5之后改成了InnoDB。


二、常见存储引擎的特性


对于MySQ来说常见的存储引擎有三种:InnoDB,MyISAM,Memory,下面注重介绍这三种存储引擎。


1、InnoDB存储引擎


InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,MySQL默认使用的存储引擎就是InnoDB。InnoDB主要特征如下:


1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。所以对比于MyISAM存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间用来保留数据和索引。


2、InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他Mysql的表类型混合起来,甚至在同一个查询中也可以混合。


3、InnoDB是为处理大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎所不能匹敌的


4、InnoDB存储引擎完全与Mysql服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维护它自己的缓存池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被现在为2GB的操作系统上。


5、MySQL支持外键完整性约束的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候,也会自动的创建对应的索引。并且在存储表中的数据时,每张表的存储都按主键存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键


6、InnoDB被用在众多需要高性能的大型数据库站点上。


7、InnoDB不创建目录,使用InnoDB时,MySQL将在Mysql数据目录下创建一个名为ibdata1的10M大小的自动扩展数据文件,以及两个名为ib_logfile()和lib_logfile1的5M大小的日志文件


8、InnoDB存储表和索引有两种方式:


  • 使用共享表空间存储,这种方式创建的表的表结构存储在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件;


  • 使用多表空间存储,这种方式创建的表的表结构依然存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。


2、MyISAM存储引擎


MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。


MyISAM拥有较高的插入、查询速度,但不支持事务和外键。MyISAM主要特征有:


1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持。


2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成


3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16


4、BLOB和TEXT列可以被索引


5、所有数字键值以高字节优先被存储以允许一个更高的索引压缩


6、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCERMENT更快


使用MyISAM引擎创建数据库,将产生3个文件。文件的名称以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为MYD(MYData)、索引文件的扩展名时,MYI(MYIndex)


3、MEMORY存储引擎


MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。MEMORY主要特性有:


1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度


2、MEMORY存储引擎执行HASH和BTREE索引


3、可以在一个MEMORY表中有非唯一键值


4、MEMORY表使用一个固定的记录长度格式


5、MEMORY不支持BLOB或者TEXT列


6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引


7、MEMORY表在所有客户端之间共享(就像其他任何非TEMPORARY表)


8、MEMORY表被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享。服务一旦关闭,表中的数据就会丢失。


9、当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)


将这三种存储引擎的主要特征总结成图表,如下:


特征
InnoDB
MyISAM
Memory
事务安全机制
支持
不支持
不支持
锁机制
行级锁(适用于高并发)
表锁
表锁
支持的索引
B树、全文、集群、数据索引
B树、全文索引
B树、哈希、数据索引
索引缓存
支持
支持
支持
存储限制
64TB
256TB RAM
批量插入速度


支持外键
支持
不支持
不支持
内存使用


一般
空间使用




三、存储引擎的选择


根据应用系统的特点选择合适的存储引擎,能够大大提高数据存储和访问的速度已经数据安全性。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合,以下是常用的集中存储引擎的使用环境。


InnoDB:InnoDB是MySQL的默认存储引擎,用于事务处理应用程序,支持外键,所以如果应用对于事务的完整性的要求比较高,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包含很多的更新、删除操作,那么应该选择InnoDB存储引擎比较好。InnoDB存储引擎除了有效的降低由于删除和更新导致的行锁定,还可以确保事务的完整提交和回滚。


MyISAM:如果应用是以读操作和插入操作为主,而只有很少的更新和删除操作,并且对于事务的完整性、并非性能的要求并不高,那么可以选择MyISAM存储引擎。


Memory:Memory存储引擎将所以的数据保证在内存中,在需要快速定位记录和其他类似数据环境下,可以提供很快的访问速度。Memory存储引擎的缺陷就是对于表的大小有限制,太大的表会无法缓存在内存中,其次就是要确保数据库异常终止之后表中的数据可以恢复。所以Memory存储引擎一般适用于不太频繁更新的小表,这样能够快速的获取到访问结果。



四、总结


以上就是关于MySQL的存储引擎的介绍。只有熟练的了解了关于数据库存储引擎的底层概念,这样在开发中我们才能够更好的使用数据库,有助于提高系统的性能。


有任何问题或者不正确的地方欢迎讨论指正!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
11天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
16天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
62 7
|
3月前
|
存储 SQL 关系型数据库
MySQL存储引擎
本文介绍了数据库优化的多个方面,包括选择合适的存储引擎、字段定义原则、避免使用外键和触发器、大文件存储策略、表拆分及字段冗余处理等。强调了从业务层面进行优化的重要性,如通过活动设计减少外部接口调用,以及在高并发场景下的流量控制与预处理措施。文章还提供了具体的SQL优化技巧和表结构优化建议,旨在提高数据库性能和可维护性。
100 1
MySQL存储引擎
|
2月前
|
存储 缓存 关系型数据库
【赵渝强老师】MySQL的MyISAM存储引擎
在MySQL5.1版本之前,默认存储引擎为MyISAM。MyISAM管理非事务表,提供高速存储和检索,支持全文搜索。其特点包括不支持事务、表级锁定、读写互阻、仅缓存索引等。适用于读多、写少且对一致性要求不高的场景。示例代码展示了MyISAM存储引擎的基本操作。
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
2月前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL的Memory存储引擎
MySQL 的存储引擎层负责数据的存储和提取,支持多种存储引擎,如 InnoDB、MyISAM 和 Memory。InnoDB 是最常用的存储引擎,从 MySQL 5.5.5 版本起成为默认引擎。Memory 存储引擎的数据仅存在于内存中,重启后数据会丢失。示例中创建了使用 Memory 引擎的 test3 表,并展示了数据在重启后消失的过程。
|
3月前
|
存储 SQL 缓存
MySQL存储引擎如何完成一条更新语句的执行!
MySQL存储引擎如何完成一条更新语句的执行!
MySQL存储引擎如何完成一条更新语句的执行!
|
4月前
|
存储 缓存 关系型数据库
MySQL高级篇——存储引擎和索引
MyISAM:不支持外键和事务,表锁不适合高并发,只缓存索引,内存要求低,查询快MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。5.5之前默认的存储引擎优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高表名.frm 存储表结构;表名.MYD 存储数据 (MYData);
MySQL高级篇——存储引擎和索引
|
5月前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
75 0
|
7月前
|
存储 关系型数据库 MySQL