主要关注 MyISAM 和 InnoDB
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持外键 |
事务 | 不支持 | 支持事务 |
行表锁 | 表级锁,即使操作一条记录也会锁住整张表,不适合高并发操作 | 行级锁,数据更新时只锁某一行,不对其他行有影响,适合高并发操作 注意:数据插入时使用表锁 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,対内存要求较高,而且内存大小対性能有决定性影响 |
表空间 | 小 | 大,分为段->区->页(页大小 16KB) 页读入到内存匹配,读入一条记录和读入一页 (包括很多条记录)的 I/O 时间是一样的 |
关注点 | 性能 | 行级锁,事务,外键,ACID 约束,热备份和容灾,MVCC,聚集索引 |
应用场景 | 处理速度快,适合查询密集,占用空间小 不支持事务等特性,只支持表级锁 |
丰富的特性,高并发,适合更新密集,二次查找,读写效率差,占用空间大 |
InnoDB 使用的存储方式是聚簇索引,每个表有且仅有一个聚簇索引。
聚簇索引指不仅缓存索引还缓存真实数据。InnoDB 默认使用主键顺序 (可自定义索引)为行记录构建一颗 B+ 树。
聚簇索引的存储并不是物理上连续的,而是逻辑上连续的,叶子结点间按照主键顺序排序,通过双向链表连接。
非聚簇索引
也称为二次索引、辅助索引,同样是一棵 B+ 树,通过非聚簇索引查找主键,再通过主键 (作为索引)去聚簇索引内查找行记录。InnoDB 经过二次查找才可定位到行记录。
MyISAM 是顺序存储的,B+ 树叶节点存放的是行记录的物理地址,定位速度快