数据库存储引擎的选择会对性能产生直接的影响。MySQL体系结构如下:

存储引擎是针对于表的而不是针对于库的(一个库中的不同表可以使用不同的存储引擎)。MyISAM 是 MySQL 5.5 之前版本默认的存储引擎。MySQL 5.5 及之后版本默认存储引擎改为了 InnoDB。

MyISAM 和 InnoDB 是最常用的两种存储引擎,除了这两种,还有一些具备特殊功能的存储引擎:CSV、Archive、Memory、Federated。简单对比如下:

存储引擎 事务 锁粒度 索引和数据存储 主要应用 忌用
MyISAM 不支持 支持并发插入的表级锁 会把索引缓存在内存中,而数据通过操作系统来进行缓存 select, insert 读写操作频繁
MRG_MyISAM 不支持 支持并发插入的表级锁 分段归档,数据仓库 全局查找过多的场景
InnoDB 支持,事务 ACID 特性 支持MVCC的行级锁 会同时在内存中缓存索引和数据,从而提高数据库的运行效率 事务处理
Archive 不支持 行级锁 日志记录,只支持insert, select 需要随机读取,更新,删除

1.MyISAM

MySQL 大部分系统表和临时表(在排序、分组等操作中,当数量超过一定大小后,由查询优化器建立的临时表)还是使用的 MyISAM。MyISAM 存储引擎表由 MYD 和 MYI 组成。

特性:

1、并发性与锁级别:非事务性存储引擎,不支持事务,表级锁。

在读取数据时,MyISAM 会对整个表加共享锁,但是共享锁之间是不会阻塞的。共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

MyISAM 表在执行查询操作的时候,其他进程对该表的读操作没有影响,但是写操作会发生阻塞,直到第一个获得读锁的进程操作完成释放完读锁后,写操作才能进行。

2、表损坏修复:

check table tablename         //对表进行检查
repair table tablename         //对表进行恢复

3、MyISAM 表支持全文索引和空间函数。

4、MyISAM 表支持数据压缩,myisampack 命令。

限制:

1、版本 < MySQL 5.0 时默认单表最大文件为 4GB,如需存储大表则要修改 MAX_Rows 和 AVG_ROW_LENGTH;版本 >= MySQL 5.0 时默认单表最大文件为 256TB。

适用场景:

1、非事务型应用;
2、只读类应用(支持数据压缩,共享锁之间是不会阻塞);
3、空间类应用(GPS 数据等)。

2.InnoDB

InnoDB 有自己表空间的概念,InnoDB 使用表空间进行数据存储。具体存在什么样的表空间,则由 innodb_file_per_table 这个参数来决定,如果这个参数为 ON,则会为每个 InnoDB 表建立一独立的表空间(tablename.ibd),为 OFF 时则会把数据存储到系统的共享表空间(ibdataX,X代表的是一个从1开始的数字)。

在 MySQL 5.6 之前版本 innodb_file_per_table 默认 OFF,MySQL 5.6 及之后版本默认 ON。

系统表空间和独立表空间要如何选择?

1、首先比较一下系统文件对表空间的管理方式:

在一个繁忙的系统中,系统表空间会不断增长,一旦磁盘空间出现不足,我们为了释放磁盘空间,不得不在系统中删除大量的无效数据(长期不使用的、日志类的数据),在删除数据后,系统表空间并不会缩小,在这种情况下,我们想通过复制文件的方式对数据库进行备份,由于虽然删除了数据,但是文件大小并不会改变,这就意味着我们每次删除时都要浪费很大的空间。

而想要收缩系统表空间的唯一方法就是把整个数据库中的所有 InnoDB 表导出后,然后删除 InnoDB 相关的表空间文件,再重启 MySQL 进行表空间的重建,然后再导入数据,这个过程十分复杂,而且十分耗时。这在一个业务繁忙的生产环境中显然是不可能做到的。

所以我们使用系统表空间进行数据存储,所面临的问题就是无法简单的收缩文件大小,造成大量的空间浪费,并且会产生大量的磁盘碎片,降低系统性能。

而使用独立表空间这个问题就很好解决了,当对一个大表中的数据进行清理之后,可以很方便的使用 optimize table 命令对这一个表进行收缩系统文件操作,虽然这种方式也会对一个表进行重建,但是对比整个系统进行重建要快的多,而且不需要重启数据库服务器,甚至不会影响正常访问。

2、比较一下这两种表空间对IO方面有哪些影响:

对于系统表空间,由于只有一个文件,如果同时对多个表进行数据刷新时,实际上在文件系统层面上是顺序进行的,会产生I/O瓶颈。

独立表空间每一个表都有自己的表空间文件,可以同时向多个文件刷新数据。

到此,可以发现,使用独立表空间要比使用系统表空间好的多,建议对 InnoDB 使用独立表空间进行数据存储。

特性:

1、并发性与锁级别:事务性存储引擎,完美支持行级锁(行级锁比表级锁支持更大的并发,吞吐量也会越高),事务 ACID 特性。

为了实现事务的原子性、一致性、持久性,InnoDB 引用了两个特殊的日志类型 Redo Log(重做日志)和 Undo Log(回滚日志)。

行级锁可以最大程度的支持并发;

行级锁是在存储引擎层实现的。

2、InnoDB 状态检查

show engine innodb status

3、MySQL 5.7 及之后版本,InnoDB 表开始支持全文索引和空间函数。

适用场景:

1、InnoDB 适用于大多数 OLTP 应用。

附一:把原来存储在系统表空间中的表转移到独立表空间中的方法:

  1. 使用 mysqldump 导出所有数据库表数据;
  2. 停止 MySQL 服务,修改参数,并删除 InnoDB 相关文件;
  3. 重启 MySQL 服务,重建 InnoDB 系统表空间;
  4. 重新导入数据。

附二:锁

锁是数据库系统区别于文件系统的一个重要特性,锁的主要作用是管理共享资源的并发访问。

锁用于实现事务的隔离性。对于未提交的事务,锁定的数据是无法被其他事务所查询到的,

锁的类型 说明 索引和数据存储
共享锁(也称为读锁) 读锁是共享的,相互之间是不会被阻塞的,多个线程可以在同一时间读取同一资源
独占锁(也称为写锁) 写锁是排他的,一个写锁会阻塞其他的读锁和写锁,这是出于数据完整性的考虑,保证了在给定的时间里,只有一个线程能执行写入并防止其他用户读取正在写入的资源

看下兼容性:

- 写锁 读锁
写锁 不兼容 不兼容
读锁 不兼容 兼容

3.CSV

CSV 存储引擎可以将 CSV 文件作为 MySQL 的表来处理,存储格式就是普通的 CSV 文件,CSV 文件如果存储在 MyISAM 或 InnoDB 中, 数据文件是不能直接查看的,因为 MyISAM 和 InnoDB 存储格式都是以二进制格式进行存储的。

当我们在 MySQL 中建立了一个 CSV 存储引擎的表时,我们可以看到三个文件系统中的文件,这三个文件是以表名为文件名的,表数据存储在 CSV 为后缀的文件中,表的元数据(如表状态、数据量 )存储在 .CSM 为后缀的文件中,表结构信息存储在 .frm 为后缀的文件中。

特点:

1、以 CSV 格式进行数据存储,CSV 格式中的每一列都是以逗号分割的,文本数据是以双引号引起来的;
2、在建表时所有列的定义必须非 NULL 的;
3、不支持索引,索引的主要作用就是优化查询效率,CSV 不支持索引,那么每次查询都会进行全表扫描,不适合大表,不适合在线处理;
4、可以对数据文件直接编辑(其他存储引擎都是以二进制格式来存储的,不可编辑);

适用场景:

1、适合做为数据交换的中间表(可以将 Excel 文件存储为 CSV 文件,然后复制到 MySQL 数据目录下,就能在 MySQL 中打开使用了);

4.Archive

Archive 存储引擎会缓存所有的写,并且利用 zlib 算法对表数据进行进行压缩,磁盘 I/O 更少。比 MyISAM 和 InnoDB 更加节约磁盘空间。

Archive 表数据存储在 ARZ 为后缀的文件中,表结构信息存储在 .frm 为后缀的文件中。

特点:

1、Archive 只支持 insert 和 select 操作,支持行级锁和专用的缓冲区,所以可以实现高并发的插入;
2、只允许在自增 ID 列上建立索引。

适用场景:

1、不需要修改和删除数据的 日志和数据采集类应用(无法在 OLTP 应用中使用)。

5.Memory

Memory 存储引擎也称为 HEAP 存储引擎,数据保存在内存中,Memory 表的数据是易丢失的,一旦 MySQL 被重启,所有 Memory 表中的数据都会消失(表结构会保留)。

Memory 表数据存储在内存中,表结构信息存储在 .frm 为后缀的文件中。

Memory 的 I/O 效率要比 MyISAM 高很多。

特点:

1、支持 HASH 索引(适合等值查找)和 BTree 索引(适合范围查找);
2、所有字段都为固定长度,就算我们在定义表时使用了 varchar(10),在存储表时还是会使用 char(10);
3、不支持 BLOG 和 TEXT 等大字段;
4、Memory 使用的是表级锁;
5、Memory 表的最大大小是由 max_heap_table_size 参数决定的,默认 16MB(对已经存在的 Memory 表修改大小是无效的,需要重建表)。

适用场景(Memory 数据易丢失,所以要求数据可再生):

1、用于查找或者是映射表,例如邮编和地区的对应表;
2、用于保存数据分析中产生的中间表;
3、用于缓存周期性聚合数据的结果表;

6.Federated

MySQL 中默认是禁止的,启动 Federated 需要在 MySQL 启动时增加 federated 参数。

特点:

1、Federated 存储引擎提供了访问远程 MySQL 服务器上表的方法;
2、本地不存储数据,数据全部放到远程服务器上;
3、本地需要保存表结构和远程服务器的连接信息。

适用场景:

1、偶尔的统计分析及手工查询。

7.如何选择正确的存储引擎

无论是否需要事务支持,只要是不需要使用 InnoDB 不支持的特殊功能外,我们都应该在新的应用中使用 InnoDB 存储引擎。

如果不想使用 InnoDB,非要从众多存储引擎中进行筛选,可以参考以下几个因素:

1、应用是否需要事务支持?

InnoDB 是目前最稳定的支持事务的存储引擎,所以还是选择 InnoDB 吧 。

2、备份?

只有 InnoDB 有在线热备方案,其他存储引擎要么不能在线热备,要么是收费的方案,所以还是选择 InnoDB 吧 。

mysqldump 并不是热备方案,这里注意一下。

3、崩溃恢复?

一般而言,MyISAM 发生崩溃后损坏数据的概率要比 InnoDB 高很多。MyISAM 恢复速度也慢,因此即使不需要事务支持,很多时候也要选择 InnoDB 存储引擎。

4、存储引擎的特有特性?

比如很多应用依赖聚集索引进行优化,那么就要选择 InnoDB。

有些应用需要使用地理空间搜索,如果使用的是 MySQL 5.7 之前的版本,只能使用 MyISAM 了,如果使用得是 MySQL 5.7 及之后的版本,还是应该使用 InnoDB。

一个数据库中,除非万不得已,否则不建议混合使用多种存储引擎,不然可能会带来一些复杂的问题和潜在的 bug。比如混合使用 MyISAM 和 InnoDB,一旦在一个事务中对两种存储引擎的表进行操作,如果出现回滚,只有 InnoDB 表中的数据会回滚,而 MyISAM 不回滚,这样就会给应用带来数据逻辑上的一些问题。

MySQL 技术内幕——存储引擎相关推荐

  1. mysql技术innodb存储引擎读后感_《MySQL技术内幕:InnoDB存储引擎》读书笔记.

    一.MySQL 体系架构和存储引擎 1.MySQL 被设计成一个单进程多线程架构的数据库,MySQL 数据库实例在系统上的表现就是一个进程. 2.MySQL 的体系架构,需要特别注意的是,存储引擎是基 ...

  2. Mysql技术内幕innodb引擎笔记

    第2章 InnoDB存储引擎 2.3 InnoDB体系架构 InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓 ...

  3. mysql技术innodb存储引擎读后感_《Mysql技术内幕-InnoDB存储引擎》读书笔记 (一)...

    @(Mysql) 官方数据库 下载 导入/data/mysql57/bin/mysql --socket /data/mysql3306/mysql.socket -uroot -ppassword1 ...

  4. Mysql技术内幕InnoDB存储引擎——InnoDB存储引擎

    特此申明: 前段时间找工作所以看了<Mysql技术内幕InnoDB存储引擎>,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处.不过无所谓啦,写出来自己看看,需要的 ...

  5. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  6. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  7. MySQL技术内幕 InnoDB存储引擎:锁问题(脏读、不可重复读)

    1.脏读 在理解脏读(Dirty Read)之前,需要理解脏数据的概念.但是脏数据和之前所介绍的脏页完全是两种不同的概念.脏页指的是在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即数据库实例内存中 ...

  8. Mysql技术内幕——InnoDB存储引擎

    一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据 ...

  9. 《MySQL技术内幕:InnoDB存储引擎》第2版笔记

    第1章 MySQL体系结构和存储引擎 1.1 定义数据库和实例 在MySQL数据库中,数据库文件可以是fm.MYD.MYI.ibd结尾的文件. MySQL数据库由后台线程以及一个共享内存区组成. My ...

最新文章

  1. python中PIL.Image和OpenCV图像格式相互转换
  2. WORD 粘贴代码 不检查语法
  3. MyBatis 实际使用案例-environments、environment
  4. leetcode 606. Construct String from Binary Tree | 606. 根据二叉树创建字符串
  5. 处理ASP.NET Core中的HTML5客户端路由回退
  6. 这本书人手一本,杠精能少97%?
  7. windows nginx 停止和启动_大数据离线项目实践之nginx服务器搭建
  8. 动态规划之最长公共子序列
  9. 【我评】——关于Web标准
  10. 最简单 NDK 样例
  11. 基于VUE的前端框架搭建
  12. LeetCode - 448 - 找出所有数组中消失的数字(find-numbers-disappeared-in-array)
  13. 一步一步实现一款实用的Android广告栏
  14. Cherry键盘-windows键-没反应
  15. 略谈中国软件产品化的路线图
  16. 【AI测试】人工智能测试、算法测试整体介绍——第一部分
  17. 图说slam(一):amcl定位算法主要流程概念图解
  18. 服务器硬盘接口有哪些种类
  19. 我们做不到一刀劈死它,但可以先切断它的一根脚趾头
  20. Python 正则表达式详解(re 库)

热门文章

  1. 联芸科技冲刺科创板上市:业绩表现不稳定,实控人方小玲为美国籍
  2. python海龟编辑器中询问并获得输入咱弄出来的积木_海龟Python编辑器下载|海龟编辑器下载 0.8.0_咕噜下载...
  3. 移动手机网站的用户设计需求
  4. 广东迅视资管 长沙青年创客推荐“励”字为2020湖南年度字
  5. JavaWeb基于老杜课程笔记的完善
  6. 电子信息科学与技术考研考计算机,电子信息科学与技术专业考研需要考哪些科目,有哪些......
  7. matlab经典实例,BP神经网络matlab实例(简单而经典)
  8. IEEE引用格式规则及示例
  9. 大白天「撞鬼」?特斯拉在无人墓地感应到行人,传感器真能测鬼?
  10. vue3(vite)设置代理,封装axios,api解耦