本文摘自PHP中文网,作者coldplay.xixi,侵删。

文章目录
- 5 MySQL体系结构
- 5.1 MyISAM
- 5.2 Innodb
- 5.2.1 系统表空间和独立表空间要如何选择
- 5.2.2 Innodb存储引擎的特性
- 5.2.3 Innodb状态检查
- 5.2.4 适用场景
- 5.2.4 (拓展) 什么是锁
- 5.2.3.1 什么是锁?
- 5.2.3.2 锁的类型:
- 5.2.3.3 写锁和读锁的兼容关系(对一行的兼容性情况)
- 5.2.3.4 锁的粒度:
- 5.2.3.5 阻塞和死锁
- 5.3 CSV存储引擎
- 5.3.1 CSV存储引擎的特点
- 5.3.2 CSV存储引擎的适用场景
- 5.4 Archive存储引擎
- 5.4.1 文件系统存储特点
- 5.4.2 Archive存储引擎的特点
- 5.4.3 Archive存储引擎使用场景
- 5.5 Memory存储引擎
- 5.5.1 文件系统存储特点
- 5.5.2 Memory的功能特点
- 5.5.3 Memory中容易混淆的概念
- 5.5.4 Memory的使用场景
- 5.6 Federated存储引擎
- 5.6.1 Federated的特点
- 5.6.2 Federated如何使用
- 5.6.3 Federated的适用场景
- 6 如何选择正确的存储引擎
接上一篇文章
5 MySQL体系结构
下面我们选一些比较常用的存储引擎进行简单的说明,mysql所使用的存储引擎会对数据库的性能产生直接的影响,还希望各位能仔细的了解存储引擎的一些特点,完了之后才使用存储引擎。
5.1 MyISAM
MyISAM在MySQL5.5之前版本是默认的存储引擎。由于这个原因,还有很多服务器在使用MyISAM这个存储引擎。同时,MyISAM目前是很多系统表,临时表所使用的存储引擎,这里说的临时表不是我们通过create table
创建出来的表,是指在排序、分组等操作中,当数量超过一定的大小之后,有查询优化器建立的临时表。
MyISAM存储引擎是由MYD和MYI组成,MYD是数据文件的扩展名,MYI是索引文件的扩展名,这个存储引擎是将表存储在以这两个为扩展名的数据文件和索引文件中。
特性:
- 并发性与锁级别
MyISAM使用的是表级锁,并不是行级锁,这也就意味着对表中的数据进行修改时,需要对整个表进行加锁,而在对表的读取时也对所有的表加共享锁,从这里我们可以看到,使用MyISAM做引擎的表读取和写入两种操作是互斥的。由此可以看到MyISAM对于读写的并发操作并不会很好。如果只对于只读取操作的话,就并发性而言,性能也还不错,因为共享锁不会阻塞共享锁。 - 表损坏修复
MyISAM支持由于任意意外关闭而损坏的MyISAM表,进行检查和修复操作,但是这里说的修复并不是数据的恢复,因为MyISAM并不是一种事务性的存储引擎,所以它不能进行事务恢复所需要的相关日志,所以要注意MyISAM表的恢复可能会造成数据的丢失。
我们可以通过check table tablename
对表进行检查,通过repair table tablename
对表进行恢复。 - MyISAM表支持的索引类型
MyISAM支持全文索引,并且在mysql5.7版本之前唯一原生就支持全文索引的官方存储引擎。 - MyISAM表支持数据压缩
如果MyISAM表示一张很大的只读表,也就是在表创建完导入数据后,就不会对表进行任何修改操作了,那我们就可以对表进行压缩了,以减少磁盘I/O。 我们可以使用myisampack
命令来对表进行压缩。压缩是对表独立进行压缩的,因此读取一行数据的时候,不必对整个表进行解压。
限制:
- 版本 < mysql5.0时默认表大小为4G
- 如存储大表则要修改MAX_Rows 和 AVG_ROW_LENGTH
- 版本 > mysql5.0时默认支持位256TB
适用场景:
- 非事务性应用
- 只读类应用(报表之类)
- 空间类应用
5.2 Innodb
Innodb是MySQL5.5及之后版本默认的存储引擎,Innodb是事务存储的存储引擎,也就是说支持事务的处理。
Innodb有自己的表空间的概念,然后数据是存储在表空间之中的,是由innodb_file_per_table
这个参数来决定的,如果这个参数为ON
,则会对每个Innodb表建立一个扩展名为ibd
的系统文件,如果这个参数为OFF
时,则会把数据存储到系统的共享表空间,也就是ibdataX
,X
代表的时一个数字,默认从1开始。
查看这个参数的命令为:show variables like 'innodb_file_per_table';
修改这个参数的命令为:set global innodb_file_per_table=off;
5.2.1 系统表空间和独立表空间要如何选择
比较:
系统表空间 | 独立表空间 |
---|---|
无法简单的收缩文件大小 | 可以通过optimize table 命令收缩系统文件 |
会产生IO瓶颈 | 可以同时向多个文件刷新数据 |
建议:
- 对Innodb使用独立表空间
把原来存在于系统表空间中的表转移到独立表空间中的方法。
步骤:
- 使用mysqldump导出所有数据库表数据
- 停止MySQL服务,修改参数,并删除Innodb相关文件
- 重启MySQL服务,重建Innodb系统表空间
- 重新导入数据
5.2.2 Innodb存储引擎的特性
- Innodb是一种事务性存储引擎
- 完全支持事务的ACID特性(之前介绍过的原子性,一致性等)
- Redo Log 和 Undo Log
Redo Log实现了事务的持久性,有两部分组成,其中一个是内存中的工作日志持久缓冲区,是由innodb_log_buffer_size决定它的大小,另一个是重构日志文件,也就是我们在文件系统中看到的ib_logflie的相关文件。Undo Log实现了事务的原子性,在事务失败时进行回滚操作。Redo Log是顺序读写的,Undo Log是随机读写的,如果可以的话可以将数据存储在固态硬盘中,以提高性能。 - Innodb支持行级锁
行级锁和表级锁是不一样的,行级锁的特点就是可以最大程度的支持并发,行级锁是由存储引擎层实现的。
5.2.3 Innodb状态检查
可以使用以下命令对Innodb状态进行检查:show engine innodb status
5.2.4 适用场景
Innodb适合于大多数OLTP应用,因为在mysql5.7版本之后,Innodb已经支持了全文索引和空间函数。
5.2.4 (拓展) 什么是锁
5.2.3.1 什么是锁?
- 锁最主要作用是管理共享资源的并发访问
- 锁用于实现事务的隔离性
5.2.3.2 锁的类型:
- 共享锁(也称读锁)
- 独占锁(也称写锁)
5.2.3.3 写锁和读锁的兼容关系(对一行的兼容性情况)
写锁 | 读锁 | |
---|---|---|
写锁 | 不兼容 | 不兼容 |
读锁 | 不兼容 | 兼容 |
在实际情况中,可能与上表的结果会有所不同,主要是因为Innodb中的锁机制是很复杂的一样东西,还有很多锁的存在影响最终的结果。
5.2.3.4 锁的粒度:
- 表级锁
- 行级锁
5.2.3.5 阻塞和死锁
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。