提示:文章先作为初版,等后续时间充足后,补充更深的内容
MyISAM和InnoDB
一、区别
MyISAM | InnoDB |
---|---|
不支持事务 | 支持事务和ACID特性 |
采用表级锁定 | 采用行级锁定(并发处理方面更好) |
使用系统缓存来缓存索引和数据 | 使用自己的缓存池(InnoDB Buffer Pool)来缓存数据和索引 |
不支持外键约束 | 支持外键约束 |
支持全文搜索(Full-Text Search)功能 | 需要通过插件或其他方式实现 |
存储总行数 | 不存储总行数 |
非聚集索引 | 聚集索引 |
(多插入不在乎排序使用MyISAM,主从同步从库也可以使用MyISAM引擎) |
mysql的索引类型跟存储引擎是相关的
InnoDB存储引擎数据文件跟索引文件全部放在ibd文件中
MyISAM的数据文件放在myd文件中,索引放在myi文件中。【其实区分聚簇索引和非聚簇索引非常简单,只要判断数据跟索引是否存储在一起就可以了】
聚集索引和非聚集索引的关系:
聚集索引(Clustered Index):聚集索引是按照数据的物理顺序组织数据的索引,一张表只能有一个聚集索引。在InnoDB存储引擎中,主键是默认的聚集索引,数据行按照主键的顺序存储在磁盘上。
非聚集索引(Non-Clustered Index):非聚集索引是独立于数据的物理顺序的索引,它存储了索引字段和对应的主键或行地址。在InnoDB存储引擎中,除了主键索引外,其他的索引都是非聚集索引。
innodb存储引擎在进行数据插入的时候,数据必须要跟索引放在一起,如果有主键就使用主键,没有主键就使用唯一键,没有唯一键就使用6字节的rowid【因此跟数据绑定在一起的就是聚簇索引】而为了避免数据冗余存储,其他的索引的叶子节点中存储的都是聚簇索引的key值,因此innodb中既有聚簇索引也有非聚簇索引,而myisam中只有非聚簇索引。
二、.xxx后缀
.FRM表结构相关数据
【聚簇】:
.IBD数据文件和索引文件
【非聚簇】:
.MYD数据文件DATA
.MYI索引文件INDEX
三、拓展
在某些情况下,使用MyISAM存储引擎可以提供一些性能优势,特别是在进行大量的批量插入操作时。因为MyISAM使用表级锁定,而不是行级锁定,因此在并发插入操作较多的情况下,MyISAM可以更高效地处理。
对于主从同步中的从库,如果从库只用于读操作,并且数据的完整性不是最高优先级,那么在某些情况下可以考虑使用MyISAM作为存储引擎。由于MyISAM没有事务支持,主从同步过程中的写操作会有一定的延迟,但如果读操作的性能是更重要的考虑因素,那么使用MyISAM可能是可行的选择。
然而,需要注意以下几点:
MyISAM不支持事务和行级锁定,这可能导致在并发写入场景下出现较多的锁冲突和性能瓶颈。
MyISAM对数据的完整性支持较弱,不提供外键约束和ACID特性,需要开发人员自行保证数据的一致性。
在主从同步中,如果主库使用的是InnoDB作为存储引擎,从库最好也使用InnoDB,以确保数据的一致性和完整性。
因此,在选择使用MyISAM作为存储引擎时,需要权衡其性能优势和数据完整性的要求,并在特定场景下进行综合考虑。对于要求更高的数据一致性和完整性的应用,通常建议使用InnoDB作为存储引擎。