MyISAM
MyISAM是MySQL5.5版本之前的默认引擎,MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成
MyISAM在读取方面有着优势。只有表级锁,增加和修改时处理相对较慢。
不支持事务与外键。
锁
用于管理共享资源并发访问实现事务隔离性。
共享锁与独占锁
- 共享锁(读锁):针对同一份数据,多个读锁可以同时进行而不相互影响。
- 独占锁(写锁):当前写操作没有完全前或阻断其他写锁和读锁。
特性
- 表损坏修复
查看表状态:check table 表名;
红框中如果不是OK则代表此表需要修复。
修复表:repair table 表名;
2. 数据压缩
MYD(数据文件、MYI(索引文件)、frm(表结构)
压缩我们压缩的是数据文件,所以我们需要将要压缩的表后者加上MYD
myisampack -b -f 数据库名.MYI
-f:强制压缩
-b: 将表备份一份。备份名为表名.OLD
Innodb
Innodb在MySQL5.5版本之后就替代料MyISAM的默认地位,成了新的默认引擎,支持事务与外键。
Innodb存储时分为独立表空间和系统表空间,系统默认使用的是独立表空间。
独立表:每张表会在数据库文件夹下都建立一个**.ibd为后缀的文件单独存放,存放较为分散。每次读取时可以同时读取多张表。
系统表:所有Innodb引擎建立的系统表都会存储到和数据库文件夹同级文件夹中的一个名为ibdataN**(N为数字)的文件中。系统表会将所有创建的表存储在一起所以导致每次只能读取一张表,并且会产生IO瓶颈。
使用show variables like 'innodb_file_per_table';
语句可以查看表的存储状况,ON为独立表,OFF为系统表。
使用set global innodb_file_per_table=off;
即可启动系统表。
特性
- 支持事务的ACID特性。
ACID特性 - Innodb支持行级锁,可以最大程度的支持并发。
Innodb同时支持表级锁和行级锁- 表级锁: 开销小,加锁快;不会出现死;锁定粒度大,发生锁冲突的概率最高,并发度最低。即使操作一条记录也会将装个表锁住。不适合高并发操作。
- 行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。操作时只锁某一行,不对其他行有影响,适合高并发操作。
##MyISAM与Innodb的区别
对比项 | MyISAM | Innodb |
---|---|---|
外键与事务 | 不支持 | 支持 |
锁 | 支持表级锁 | 支持表级锁和行级锁,适合高并发操作 |
缓存 | 值缓存索引 ,不缓存真实数据 | 不仅缓存索引还会缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
CSV
数据以文本方式存储在文件中
.CSV文件存储表内容
.CSM文件存储表的元数据如表状态和数据量
.frm文件存储表结构信息
特性
- 不支持自增,不支持主键,不支持索引,不支持空值
- 可以用Excel或者文本编辑器直接打开.CSV格式的文件进行编辑。
使用场景
适合做为数据交换的中间表
Memory
也称HEAP存储引擎,所以数据保存在内存中,如果MySQL服务重启数据会丢失,但是表结构会保存下来
特性
- 支持HASH索引和BTree索引
- 所有字段都为固定长度 varchar(10)=char(10)
- 不支持BLOB和TEXT等大字段
- Memory存储引擎使用表级锁
选取引擎
大部分情况下,InnoDB都是正确的选择,可以简单地归纳为一句话“除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎