MySQL学习笔记 03、MySQL存储引擎
【摘要】 文章目录前言一、介绍存储引擎1.1、InnoDB引擎1.2、MyISAM引擎二、InnoDB与MyISAM的对比三、不同的场景选择引擎
前言
本篇博客是MySQL的学习笔记,若文章中出现相关问题,请指出!
所有博客文件目录索引:博客目录索引(持续更新)
一、介绍存储引擎
1.1、InnoDB引擎
在MySQL5.5版本后,MySQL的默认内置存储引擎已经是InnoDB引擎了,主要特点如下:
支持
@[toc]
前言
本篇博客是MySQL的学习笔记,若文章中出现相关问题,请指出!
所有博客文件目录索引:博客目录索引(持续更新)
一、介绍存储引擎
1.1、InnoDB引擎
在MySQL5.5版本后,MySQL的默认内置存储引擎已经是InnoDB引擎了,主要特点如下:
- 支持事务,其默认事务级别为
RR
(Repeatable read,可重复读),通过MVCC(并发版本控制)实现。 - 使用锁粒度是
行级锁
,可以支持更高的并发。 - 支持外键。
- 在InnoDB中存在缓冲管理,通过缓冲池将索引和数据全部缓存起来,能够加快查询的速度。
- 对于InnoDB类型的表,其数据的物理组织形式是聚簇表,所以的数据按照主键来组织。数据和索引放在一块,位于B+树的叶子节点上。
1.2、MyISAM引擎
在5.5版本之前,MyISAM是MySQL的默认存储引擎,该存储引擎并发性差,不支持事务,使用的场景较少,特点如下:
- 不支持事务。
- 不支持外键,如果强行增加外键,不会提示错误,但是外键会无效。
- 对数据的查询缓存只会缓存索引,不会像InnoDB一样缓存数据,而是利用操作系统本身的缓存。
- 默认的锁粒度是表级锁,所以并发度很差,加锁快,锁冲突较少,所以不太容易出现死锁。
- 支持全文索引(5.6版本以后,InnoDB存储引擎也对全文索引做了支持),但是MySQL的全文索引基本不会使用,对于全文索引,现如今在Java层面有许多成熟的解决方案,如
ElasticSearch
,Solr
,Sphinx
。 - 数据库的主机如果宕机,MyISAM的数据文件容易损坏,而且难恢复。
二、InnoDB与MyISAM的对比
- 由于锁粒度不同,InnoDB比MyISAM支持更高的并发。
- InnDB为行级锁,MyISAM为表级锁。InnoDB相对于MyISAM来说更容易发生死锁,锁冲突的概率大,而且上锁的开销更大,需要为每一行加锁。
- 在备份容灾上,InnoDB支持在线热备,有很成熟的在线热备解决方案。
热备
:一般运行,数据能够一边备份。冷备
:需要让它停止下来进行备份。
- 在查询性能上来看,MyISAM的查询效率高于
InnoDB
,因为InnoDB
在查询过程中是需要维护数据缓存,而且查询过程中是先定位到行所在的数据块,然后再从数据块中定位到要找到的行;而MyISAM
可以直接定位到数据所在的内存地址,可以直接找到数据。 - 查询表记录总数量(
select count(*)
)上MyISAM比InnoDB能够更快的查询。如果行数在千万级别上,MyISAM可以快速查出,而InnoDB查询的特别慢,因为MyISAM将行数单独存储了,而InnoDB需要逐行去统计行数;如果使用InnoDB,并且频繁需要查询行数时,需要对行数进行特殊处理,例如:离线查询并缓存,在Java层面查询一次之后存储到Map对象里(存储到内存中)。 - MyISAM与InnoDB的表数据文件各不相同。MyISAM有三个表文件:
.frm
(表结构定义)、.MYI
(索引)、.MYD
(数据);而InnoDB的表数据文件为:.idb
(数据与缓存)和.frm
(表结构)。
不同引擎的表文件如下:
①在InnoDB中,一个表一般由.ibd(数据及索引)以及.frm(存储表信息)组成,分别存放表结构以及表数据。
- 注意:MySQL8.0中没有.frm呢,直接存储到InnoDB引擎中去了。
②在MyISAM
引擎中,一个表由三个文件组成.frm
、.MYD
(mydata)、.MYI
(myindex)
三、不同的场景选择引擎
不同场景需求介绍:
- 根据场景是否需要事务支持?需要选择InnoDB。
- 是否需要支持高并发?需要选择InnoDB。
- 是否需要外键?需要选择InnoDB。
- 是否需要高效缓冲数据?InnoDB对数据与索引都做了缓冲,而MyISAM只缓冲了索引。
- 对于索引采用的数据结构选择?InnoDB选择B+树作为存储数据与索引。MyISAM则是选择哈希。
MyISAM
应用场景:字典管理(不需要事务)、多查询。
我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)