MyISAM和InnoDB

本文对比了MySQL的两种主要存储引擎MyISAM和InnoDB。MyISAM适合读取密集型应用,访问速度快,不支持事务。InnoDB则是默认存储引擎,支持事务处理和外键,适合高并发和数据一致性的场景。InnoDB在存储方式上有共享表空间和多表空间两种选择。MyISAM的文件结构包括.frm、.MYD和.MYI,而InnoDB的数据和索引保存在表空间中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MyISAM

(1)MySQL 5.5之前的默认存储引擎,不支持事务,不支持外键,优势是访问速度快。

(2)每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名指出文件类型。  

  • .frm文件存储表定义。 
  • 数据文件的扩展名为.MYD (MYData)。 
  • 索引文件的扩展名是.MYI (MYIndex)。

数据文件和索引文件可以放置在不同的目录,平均分布IO,获得更快的速度。

(3)支持3种不同的存储格式

  • 静态表(固定长度):每个记录都是固定长度,存储时按照列的宽度定义补齐,应用访问时,返回给应用的空格会去掉。优点:存储迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态多。
  • 动态表:表中包含变长字段。优点:占用空间相对较少;缺点:频繁地更新和删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或者myisamchk-r命令来改善性能。
  • 压缩表:由myisampack工具创建,占据非常小的磁盘空间。因为每个记录被单独压缩,所以访问开支非常小。

2.InnoDB

(1)MySQL 5.5之后默认存储引擎。具有提交、回滚和崩溃恢复能力的事务安全,但是和MyISAM相比,写的处理效果较差,并且会占用更多的磁盘空间以保存数据和索引。

(2)自动增长列

  • InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
  • MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。

 (3)只有InnoDB支持外键。在创建外键时,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

(4)存储方式有两种:

  • 使用共享表空间存储:这种方式创建的表的表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。
  • 使用多表空间存储:这种方式创建的表的表结构保存在.frm文件中,但是每个表的数据和索引单独保存在.ibd中。如果是个分区表,则每个分区对应单独的.idb文件,文件名是“表名+分区名”,可以在创建分区的时候指定每个分区的数据文件位置,以此来将表的IO均匀分布在多个磁盘上。多表空间的参数生效后,只对新建的表生效。

3.适用环境

  •  MyISAM:应用以读操作和插入为主,很少更新和删除,并且对事务的完整性和并发性要求不高,选择MyISAM。MyISAM是在Web、数据仓库等应用环境下最常用的存储引擎之一。
  • InnoDB:如果应用程序对事务的完整性有较高的要求,在并发条件下要求数据的一致性,数据除了插入和查询外,还包括很多的更新、删除操作,InnoDB比较合适。InnoDB可以有效降低由于删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB都是合适的选择。

 

参考《深入浅出MySQL》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值