mysql myisam 和 innodb 的区别
1. myisam 和 innodb 的区别
-
事务方面
innodb 支持事务,myisam 不支持事务
-
外键方面
innodb 支持外键,而 myisam 不支持。对一个包含外键的 innodb 表转为 myisam 会失败。
-
索引层面
innodb 是聚簇索引,myisam 是非聚簇索引
myisam 支持 fulltext类型的全文索引, innodb 不支持 FULLTEXT 类型的全文索引,但是 innodb 可以使用 sphinx 插件支持全文索引,并且效果更好。
-
锁粒度方面
innodb 最小的锁粒度是 行锁 ,myisam 最小的锁粒度是 表锁 。
一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。
-
硬盘存储结构
myisam 在磁盘上存储成三个文件
- . frm 文件存储表的定义
- 数据文件 的扩 展名为 . MYD (MYData)。
- 索引文件 的扩 展名是 . MYI (MYIndex)。
innodb 存储引擎存储数据库数据,一共有两个文件(没有专门保存数据的文件):
- Frm 文件:表的定义文件。
- Ibd 文件:数据和索引存储文件。数据以主键进行聚集存储,把真正的数据保存在叶子节点中。
2. 局簇索引和非局簇索引的区别
-
聚簇索引(innodb)
将 数据 存储与 索引 放到了一块,索引结构的 叶子节点 保存了 行数据
表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。
innodb 中,在聚簇索引之上创建的索引称之为辅助索引,像复合索引、前缀索引、唯一索引等等。
- 聚簇索引默认是主键,
- 如果表中没有定义主键,innodb 会选择一个 唯一的非空索引 代替。
- 如果没有这样的索引,innodb 会在内部生成一个名为 GEN_CLUST_INDEX 的隐式的聚簇索引。
-
非聚簇索引(MyISAM)
将 数据 与 索引 分开存储,表数据存储顺序与索引顺序无关
2. 索引查询过程
-
非聚簇索引存储结构(MyISAM)
MyISAM的 B+树 的叶子节点上,记录的是真实数据的存储地址。比如通过主键id查询,MyISAM查询流程如下:
- 根据id值在B+树上找到相应的叶子节点
- 取出叶子节点上的数据存储地址
- 根据数据存储地址,去找到相应的真实数据
通过主键id查询的时候,InnoDB比MyIsam快一些,因为InnoDB只需要一次B+树查找就能取出数据。MyIsam通过B+树查找到地址后,还需要根据地址去查询真正的数据
还比如说在数据重构的时候,MyIsam记录的是数据地址,那么重构数据的时候地址就要重新生成一遍,这也是有问题的。
InnoDB重构数据的时候就不会这样,因为他记录的是主键id,地址会变化,主键id是不会变的。
-
聚簇索引存储结构(innodb)
InnoDB的 B+树 的叶子节点上,记录的是真实行数据。比如通过主键id查询,InnoDB查询流程如下:
聚簇索引(主键索引):
- 根据id值在B+树上找到相应的叶子节点
- 取出叶子节点上的行数据,返回即可
辅助索引(聚簇索引以外的):
- 在相应索引的B+树上找到相应的叶子节点
- 取出叶子节点上的数据,该数据是主键id
- 拿到主键id后,去主键索引的B+树上找到相应的叶子节点
- 取出叶子节点上的行数据,返回