数据存储结构
- MyISAM:将表数据和索引分开存储,数据文件和索引文件分别以.MYD 和.MYI 为扩展名。数据文件按照记录插入的顺序存储,索引文件则是 B + 树结构,叶子节点存储的是数据记录的物理地址。
- InnoDB:采用聚集索引的方式存储数据,将数据和索引存储在同一个文件中,通常以.ibd 为扩展名。表数据按照主键的顺序存储在聚簇索引的叶子节点中,如果没有显式定义主键,InnoDB 会选择一个唯一的非空索引作为聚簇索引的键,如果没有这样的索引,InnoDB 会自动生成一个隐藏的主键。
事务支持
- MyISAM:不支持事务,这意味着在执行多个操作时,如果出现错误,无法进行回滚操作来保证数据的一致性。它适用于对事务要求不高,以读操作为主的应用场景,如一些简单的博客系统、数据仓库等。
- InnoDB:支持事务,遵循 ACID 特性(原子性、一致性、隔离性、持久性),能够保证在事务执行过程中,数据的完整性和一致性。它提供了多种事务隔离级别,可以根据具体的业务需求进行选择。
锁机制
- MyISAM:采用表级锁,即在执行操作时,会对整个表进行锁定。这意味着在同一时间内,只能有一个线程对表进行写操作,读操作可以并发进行,但写操作会阻塞读操作和其他写操作,并发性能较差。
- InnoDB:支持行级锁和表级锁,默认采用行级锁。行级锁可以精确地控制对数据行的访问,在并发操作时,只有涉及到的行才会被锁定,其他行可以被其他线程并发访问,大大提高了并发性能,但行级锁的实现相对复杂,会带来一定的性能开销。
数据完整性
- MyISAM:在数据完整性方面的支持相对较弱,不支持外键约束等功能。在进行数据插入、更新和删除操作时,不会自动检查数据之间的关联关系,需要在应用层进行额外的逻辑处理来保证数据的完整性。
- InnoDB:支持外键约束,能够在数据库层面保证数据的完整性和一致性。当定义了外键关系后,InnoDB 会自动检查插入、更新和删除操作是否违反外键约束,如果违反,则会抛出错误,阻止操作的执行。
崩溃恢复能力
- MyISAM:崩溃恢复能力相对较弱,在数据库崩溃后,可能需要手动进行修复操作,如使用工具检查和修复表结构和数据。
- InnoDB:具有强大的崩溃恢复能力,它通过事务日志(redo log 和 undo log)来记录数据的更改操作。在数据库崩溃后,InnoDB 可以根据事务日志中的信息,自动进行崩溃恢复,将数据库恢复到崩溃前的一致性状态。
存储特点
- MyISAM:表存储格式有静态、动态和压缩三种。静态表的列长度固定,访问速度快,但会浪费一定的存储空间;动态表的列长度可变,节省存储空间,但访问速度相对较慢;压缩表用于只读数据,可大大节省存储空间。
- InnoDB:存储格式较为统一,主要是按照页为单位进行存储,页大小通常为 16KB。InnoDB 会根据数据的使用频率等因素,自动对数据进行缓存和管理,以提高访问性能。