mysql系列之存储引擎

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本篇主要介绍mysql的存储引擎,说明主要的几个存储引擎的特性及其差别。

一、存储引擎介绍


28.png


数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。


MySQL 的核心就是存储引擎,不同存储引擎支持的特性各不相同。


MySQL中的存储引擎是插件式存储引擎。


MySQL 5.5.5 之后,InnoDB 作为默认存储引擎。


MySQL中的存储引擎的控制级别是表级别,我们可以在建表的时候指定表采用的存储引擎。


二、MySQL支持的存储引擎类型


MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。


可以使用SHOW ENGINES语句查看系统所支持的引擎类型,结果如图所示。

27.png

Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。


官网对各个存储引擎特性的说明:

Feature

MyISAM Memory InnoDB Archive

NDB

事务支持 No No Yes No Yes
锁的粒度 Table Table Row Row Row
存储限制 256TB RAM 64TB

None

384EB
MVCC(多版本控制) No No Yes No No
外键支持 No No Yes No Yes (note 5)
聚簇索引 No No Yes No No
B-tree indexes Yes Yes Yes No No
全文检索支持 Yes No Yes (note 6) No No
地理空间数据类型支持 Yes No Yes Yes Yes
地理空间索引支持 Yes No Yes (note 7) No No
Hash indexes No Yes

No (note 8)

No Yes
T-tree 索引 No No No No Yes
索引缓存 Yes N/A Yes No Yes
集群支持 No No No

No

Yes
压缩数据 Yes No Yes

Yes

No
数据缓存 No N/A Yes

No

Yes
数据加密 Yes (note 3) Yes (note 3) Yes (note 4)

Yes (note 3)

Yes (note 3)
备份和时间点恢复 Yes Yes Yes Yes Yes
Replication support (主从支持) Yes Limited (note 9) Yes Yes Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes

注意:

根据特性的重要程度和差别情况,对顺序进行了一定的调整。


三、重点引擎的类型介绍


1、InnoDB存储引擎

从MySQL5.5版本之后,MySQL的默认内置存储引擎已经是InnoDB了,他的主要特点有:

(1)灾难恢复性比较好;

(2)支持事务。默认的事务隔离级别为可重复读,通过MVCC(并发版本控制)来实现的。

(3)使用的锁粒度为行级锁,可以支持更高的并发;

(4)支持外键;

(5)配合一些热备工具可以支持在线热备份;

(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;

(7)支持聚簇索引。对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上,通过聚簇索引来查询可以减少回表查询。

(8)InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描

(9)支持B-tree索引和全文检索( MySQL 5.6后InnoDB存储引擎开始支持全文检索)

(10)不支持Hash索引,但是内置了自适应hash索引。


2、MyISAM存储引擎

在5.5版本之前,MyISAM是MySQL的默认存储引擎,该存储引擎并发性差,不支持事务,所以使用场景比较少,主要特点为:


(1)不支持事务;

(2)不支持外键,如果强行增加外键,不会提示错误,只是外键不其作用;

(3)不支持聚簇索引,对数据的查询缓存只会缓存索引,不会像InnoDB一样缓存数据,而且是利用操作系统本身的缓存;

(4)默认的锁粒度为表级锁,所以并发度很差,加锁快,锁冲突较少,所以不太容易发生死锁;

(5)支持全文索引(MySQL5.6之后,InnoDB存储引擎也对全文索引做了支持),但是MySQL的全文索引基本不会使用,对于全文索引,现在有其他成熟的解决方案,比如:ElasticSearch,Solr,Sphinx等。

(6)数据库所在主机如果宕机,MyISAM的数据文件容易损坏,而且难恢复;


重点:InnoDB和MyISAM的对比

1、事务支持:InnoDB支持事务,MyISAM不支持事务。

2、锁粒度:InnoDB为行级锁,MyISAM为表级锁。

所以MyISAM相对于InnoDB来说,更容易发生死锁,锁冲突的概率更大,而且上锁的开销也更大,因为需要为每一行加锁,所以InnoDB比MyISAM支持更高的并发;

3、外键支持:InnoDB支持外键,MyISAM不支持外键。

4、聚簇索引支持:InnoDB支持聚簇索引,MyISAM不支持聚簇。

5、数据安全和备份:在备份容灾上,InnoDB支持在线热备,有很成熟的在线热备解决方案;

6、查询性能:MyISAM的查询效率高于InnoDB,因为InnoDB在查询过程中,是需要维护数据缓存,而且查询过程是先定位到行所在的数据块,然后在从数据块中定位到要查找的行;而MyISAM可以直接定位到数据所在的内存地址,可以直接找到数据;

7、表总记录数统计:SELECT COUNT(*)语句,如果行数在千万级别以上,MyISAM可以快速查出,而InnoDB查询的特别慢,因为MyISAM将行数单独存储了,而InnoDB需要朱行去统计行数;所以如果使用InnoDB,而且需要查询行数,则需要对行数进行特殊处理,如:离线查询并缓存;

8、存储文件:MyISAM的表结构文件包括:.frm(表结构定义),.MYI(索引),.MYD(数据);而InnoDB的表数据文件为:.ibd和.frm(表结构定义);


3、MEMORY存储引擎

将数据存在内存中,和市场上的Redis,memcached等思想类似,为了提高数据的访问速度,主要特点:


(1)支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

(2)支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

(3)由于数据是存放在内存中,所以在服务器重启之后,所有数据都会丢失;

(4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;


四、如何选择合适的存储引擎


1、使用场景是否需要事务支持;

2、是否需要支持高并发,InnoDB的并发度远高于MyISAM;

3、是否需要支持外键;

4、是否需要支持在线热备;

5、高效缓冲数据,InnoDB对数据和索引都做了缓冲,而MyISAM只缓冲了索引;

6、索引,不同存储引擎的索引并不太一样;

7、是否需要支持集群。


总的来说,目前主流的MySQL使用场景都是采用InnoDB存储引擎,这也是为什么MySQL官方在MySQL 5.5.5 之后将InnoDB 作为默认存储引擎的原因。


五、存储引擎设置


1、建表的时候指定存储引擎

CREATE TABLE t1 (i INT) ENGINE = INNODB;


2、设置默认的存储引擎

MySQL 5.5.5 之后InnoDB是默认存储引擎,如果需要修改默认的存储引擎,可以通过修改my.cnf配置文件中的default-storage-engine的值。


default_storage_engine=NDBCLUSTER;


3、修改表的存储引擎

ALTER TABLE t ENGINE = InnoDB;


总结


本文主要介绍了mysql的存储引擎以及各存储引擎的特性。

根据各个存储引擎的特性指出各自适用的使用场景。

核心是:InnoDB和MyISAM的区别,面试中的高频问题。

注意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优化技巧和表结构优化建议,旨在提高数据库性能和可维护性。
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