MySQL存储引擎 - MyISAM与InnoDB的优劣
一、MyISAM 与 InnoDB 的异同
| 特点 | MyISAM | InnoDB |
| 存储限制 | 有 | 64TB |
| 事务安全 | 支持 | |
| 锁机制 | 表锁 | 行锁 |
| B树索引 | 支持 | 支持 |
| 哈希索引 | ||
| 全文索引 | 支持 | |
| 集群索引 | 支持 | |
| 数据缓存 | 支持 | |
| 索引缓存 | 支持 | 支持 |
| 数据可压缩 | 支持 | |
| 空间使用 | 低 | 高 |
| 内存使用 | 低 | 高 |
| 批量插入速度 | 高 | 低 |
| 支持外键 | 支持 |
二、MyISAM的特性
- 优势:访问速度快,适用于不需要做事务、以读数据和插数据为主的业务
- 存储方式:
- .frm 存储表定义
- .MYD MYDATA存储数据
- .MYI MYINDEX存储索引
- 默认存储在同一路径下,可在建表时通过DATA DIRECTORY和INDEX DIRECTORY设置数据和索引的存储位置(需要绝对路径)
- 存储格式:
-
- 静态(固定长度表)表:MyISAM默认存储格式,所有字段为非变长字段,所有记录长度固定;优点是存储快、易缓存、易恢复;缺点是占用空间大 (注:数据后边的空格会被去掉)
- 动态表:表中包含变长字段;优点:占用空间少;缺点:故障不易恢复、频繁的更新和删除会产生碎片,需要定期执行OPTIMIZE TABLE语句或myismchk-r命令来改善性能;
- 压缩表:由myisampack工具创建,占用空间非常小,每个记录单独压缩,只有非常小的访问开支;
三、InnoDB的特性
- 优势:支持事务、外键约束、行级锁
- 自增列:自增列必须是索引,如果是联合索引则必须在第一位;MyISAM则不同,MyISAM的自增列可以位于联合索引的任一位置,根据前边的几列完成自增;
- 外键约束:InnoDB是目前唯一支持外键约束的MySQL引擎;在创建外键时,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引;在创建索引时可以指定在删除、更新父表时,对子表进行的操作:
- RESTRICT、NO ACTION:在子表存在记录时,父表不能更新;
- CASCADE:在父表更新或删除时,同时更新或删除子表对应记录;
- SET NULL:父表更新或删除时,子表对应记录被置为NULL;
- 存储方式:
-
- 共享表空间存储:
- .frm:表结构
- .innodb_data_home_dir和innodb_data_file_path定义的表空间:索引、数据,可以是多个文件(为了均衡负载)
- 多表空间存储(通过参数innodb_file_per_table设置,重启生效,存量表不变):
- .frm:表结构
- .ibd:每个表的数据和索引单独保存在.ibd中;如果是分区表,则每个分区对应单独的.ibd文件s,文件名是表名+分区名,可以在创建分区时指定每个分区的数据文件位置,均衡负载
- 共享表空间存储:
四、总结
MyISAM:默认的MySQL插件式存储引擎,适合不需要事务以及以读和插入为主的业务,在web和数据仓库中常用
InnoDB:支持事务和外键,对事务完整性有要求,在并发条件下要求数据一致性,有更多的更新和删除操作的业务(行级锁优势),适合使用InnoDB,在计费、财务系统常用
五、待发散话题
- MySQL锁的机制
- 索引的数据结构
- 数据、索引缓存

浙公网安备 33010602011771号