MySQL学习笔记 03、MySQL存储引擎

举报
长路 发表于 2022/11/23 00:04:21 2022/11/23
【摘要】 文章目录前言一、介绍存储引擎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引擎了,主要特点如下:

  1. 支持事务,其默认事务级别为RR(Repeatable read,可重复读),通过MVCC(并发版本控制)实现。
  2. 使用锁粒度是行级锁,可以支持更高的并发。
  3. 支持外键
  4. 在InnoDB中存在缓冲管理,通过缓冲池将索引和数据全部缓存起来,能够加快查询的速度。
  5. 对于InnoDB类型的表,其数据的物理组织形式是聚簇表,所以的数据按照主键来组织。数据和索引放在一块,位于B+树的叶子节点上。


1.2、MyISAM引擎

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

  1. 不支持事务。
  2. 不支持外键,如果强行增加外键,不会提示错误,但是外键会无效。
  3. 对数据的查询缓存只会缓存索引,不会像InnoDB一样缓存数据,而是利用操作系统本身的缓存。
  4. 默认的锁粒度是表级锁,所以并发度很差,加锁快,锁冲突较少,所以不太容易出现死锁。
  5. 支持全文索引(5.6版本以后,InnoDB存储引擎也对全文索引做了支持),但是MySQL的全文索引基本不会使用,对于全文索引,现如今在Java层面有许多成熟的解决方案,如ElasticSearchSolrSphinx
  6. 数据库的主机如果宕机,MyISAM的数据文件容易损坏,而且难恢复。


二、InnoDB与MyISAM的对比

  1. 由于锁粒度不同,InnoDB比MyISAM支持更高的并发
  2. InnDB为行级锁,MyISAM为表级锁。InnoDB相对于MyISAM来说更容易发生死锁,锁冲突的概率大,而且上锁的开销更大,需要为每一行加锁。
  3. 备份容灾上,InnoDB支持在线热备,有很成熟的在线热备解决方案。
    • 热备:一般运行,数据能够一边备份。冷备:需要让它停止下来进行备份。
  4. 查询性能上来看,MyISAM的查询效率高于InnoDB,因为InnoDB在查询过程中是需要维护数据缓存,而且查询过程中是先定位到行所在的数据块,然后再从数据块中定位到要找到的行;而MyISAM可以直接定位到数据所在的内存地址,可以直接找到数据。
  5. 查询表记录总数量(select count(*))上MyISAM比InnoDB能够更快的查询。如果行数在千万级别上,MyISAM可以快速查出,而InnoDB查询的特别慢,因为MyISAM将行数单独存储了,而InnoDB需要逐行去统计行数;如果使用InnoDB,并且频繁需要查询行数时,需要对行数进行特殊处理,例如:离线查询并缓存,在Java层面查询一次之后存储到Map对象里(存储到内存中)。
  6. MyISAM与InnoDB的表数据文件各不相同。MyISAM有三个表文件:.frm(表结构定义)、.MYI(索引)、.MYD(数据);而InnoDB的表数据文件为:.idb(数据与缓存)和.frm(表结构)。

不同引擎的表文件如下

①在InnoDB中,一个表一般由.ibd(数据及索引)以及.frm(存储表信息)组成,分别存放表结构以及表数据。

  • 注意:MySQL8.0中没有.frm呢,直接存储到InnoDB引擎中去了。

②在MyISAM引擎中,一个表由三个文件组成.frm.MYD(mydata)、.MYI(myindex)

image-20210430193104919



三、不同的场景选择引擎

不同场景需求介绍

  1. 根据场景是否需要事务支持?需要选择InnoDB。
  2. 是否需要支持高并发?需要选择InnoDB。
  3. 是否需要外键?需要选择InnoDB。
  4. 是否需要高效缓冲数据?InnoDB对数据与索引都做了缓冲,而MyISAM只缓冲了索引。
  5. 对于索引采用的数据结构选择?InnoDB选择B+树作为存储数据与索引。MyISAM则是选择哈希。

MyISAM应用场景:字典管理(不需要事务)、多查询。

我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。