Mysql的两种存储引擎详细分析及区别(全)

简介: 目录前言总结前言mysql有多种存储引擎(MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。)但是常用的主要是这两种,分别为myism和innodb总结区别MyISAMInnoDB构成上的区别: 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (

前言

mysql有多种存储引擎(MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。)

但是常用的主要是这两种,分别为myism和innodb

补充说明一下
这两种数据结构都是用的b+树
在这里插入图片描述
B+树的非叶子节点不存储数据,只有叶子节点才存储数据
而B树的非叶子和叶子节点都会存储数据,会导致非叶子节点存储的索引值会更少,树的高度相对会比B+树高,平均的I/O效率会比较低

所以使用B+树作为索引的数据结构,再加上B+树的叶子节点之间会有指针相连,也方便进行范围查找

1. MyISAM(非聚集索引)

  • 不支持事务,但是操作是有原子性的
  • 不支持外键,支持表锁,每次操作的时候都是锁住整张表

具体关于sql的锁机制
可看我之前的文章
Mysql中各类锁的机制图文详细解析(全)

  • update会有表锁,所以并发量小,因为会进行阻塞。所以如果执行大量的SELECT,MyISAM是更好的选择
  • 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性
  • MyISAM表格可以被压缩,而且它们支持全文搜索
  • MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引
  • MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)的数据查询的时候比较快,但是如果加了where条件,就会比较慢
  • 对于自增长的字段,在MyISAM表中可以和其他字段一起建立联合索引

主键索引
在这里插入图片描述

辅助索引
在这里插入图片描述
对于上述两幅索引图来说

MyISAM存储引擎在使用索引查询数据时,会先根据索引查找到数据地址,再根据地址查询到具体的数据。并且主键索引和辅助索引没有太多区别。

两个表都是差不多,查找的思路也都是根据索引找到数据地址,在通过数据地址找到数据

2. InnoDB(聚集索引)

与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能。

  • 支持外键
  • 支持行锁,采用MVCC来支持高并发,有可能死锁
  • 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引
  • InnoDB用于事务处理,具有ACID事务支持等特性。如果在应用中执行大量insert和update操作,可选择。
  • 不支持全文搜索

主键索引
在这里插入图片描述

辅助索引
在这里插入图片描述
InnoDB中主键索引的叶子节点的数据区域存储的是数据记录,辅助索引存储的是主键值
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;

因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问主键索引;

最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

Innodb中的主键索引和实际数据时绑定在一起的,也就是说Innodb的一个表一定要有主键索引,如果一个表没有手动建立主键索引,Innodb会查看有没有唯一索引,如果有则选用唯一索引作为主键索引,如果连唯一索引也没有,则会默认建立一个隐藏的主键索引(用户不可见)。(用户没有指定的话会自己找生产一个隐藏列Row_id来充当默认主键)

另外,Innodb的主键索引要比MyISAM的主键索引查询效率要高(少一次磁盘IO),并且比辅助索引也要高很多。

所以,我们在使用Innodb作为存储引擎时,我们最好︰

  1. 手动建立主键索引
  2. 尽量利用主键索引查询

自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)

3. 总结

区别 MyISAM InnoDB
结构 每个MyISAM在磁盘上存储成三个文件(扩展名指出文件类型)。 .frm文件存储表定义,也就是存储结构的信息。.MYD文件存放数据文件。.MYI存放索引文件 表空间数据文件和它的日志文件。没有了myd与myi,只有.idb放了索引位置以及表的信息位置
事务 强调的是性能,不提供事务支持 提供事务支持事务,外部键等高级数据库功能
CRUD 查询很合适 增加或者更新合适。删除的时候,是一行一行删除
表的具体行数 select count(*) from table,可以很好的读取 不保存表的具体行数,要扫描一遍整个表来计算有多少行
AUTO_INCREMENT 可以和其他字段一起建立联合索引 必须包含只有该字段的索引
全文索引 支持 不支持
外键 不支持 支持
表锁 提供行锁(执行一个SQL语句时MySQL不能确定要扫描的范围,同样会锁全表, 例如update table set num=1 where name like "%aaa%)

MyISAM

  • 优点:查询数据相对较快,适合大量的select,可以全文索引。
  • 缺点:不支持事务,不支持外键,并发量较小,不适合大量update

InnoDB:

  • 优点:支持事务,支持外键,并发量较大,适合大量update
  • 缺点:查询数据相对较快,不适合大量的select

可能注意到我的标题有聚集索引和非聚集索引

具体这两部分的区分是

  1. 聚集索引(聚簇索引):表中的数据都会有一个主键,即使不创建主键,系统也会帮你创建一个隐式的主键。这是因为innodb是把数据存放在B+树中的,而B+树的键值就是主键,在B+树的叶子节点中,存储了表中所有的数据。这种以主键作为B+树索引的键值而构建的B+树索引,我们称之为聚集索引。`在B+树中,叶子节点存储整条记录的数据,这样的索引为聚集索引。`
  2. 非聚集索引(非聚簇索引):以主键以外的列值作为键值构建的B+树索引,我们称之为非聚集索引。叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
587 158
|
9月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
10月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
626 156
|
10月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
738 161
|
9月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
907 6
|
10月前
|
存储 关系型数据库 MySQL
MySQL中的int(10)、char(10)与varchar(10)的类型和区别
在选择正确的数据类型时,需要仔细考虑每列的数据特点及应用程序的使用情况。合理的数据类型选择可以优化存储空间的使用,提高查询速度和数据库的整体性能。
797 14
|
11月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
304 12
|
11月前
|
存储 关系型数据库 MySQL
MySQL数据库中的 char 与 varchar的区别是什么
MySQL中的char和varchar均用于存储字符串,但有显著区别。char为定长类型,固定长度,存储空间始终为设定值,适合长度固定的数据如手机号。varchar为变长类型,仅占用实际数据所需空间,适合长度不固定的内容如用户名。二者在性能与空间利用上各有优劣,应根据实际场景合理选择。
622 0
|
10月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1540 152

推荐镜像

更多