innodb和myisam是Mysql中常用的两种引擎,以下是两者的比较:
| innodb | myisam | |
|---|---|---|
| 对事务的支持 | 支持四种事务的隔离级别 | 不支持 |
| 支持的锁种类 | 行锁、页锁、表锁 | 表锁 |
| 是否支持全文索引 | 不支持 | 支持 |
| 索引 | 聚集索引 | 非聚集索引 |
| 并发 | 根据事务隔离级别 | 读写互相阻塞 |
| 储存 | 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件 | 在磁盘中储存成三个文件,分别是:索引文件、数据文件、表定义 |
| 使用场景 | 事务要求高,对数据大量的修改操作… | 事务要求不高,查询操作多、并发低… |
下面看一下两者的索引实现的原理:
myisam:非聚集索引
采用B+树的数据索引结构
索引作为单独的文件储存起来,记录了数据的存放地址

上图以表的Col1字段作为主键,可以看出索引文件里储存的是数据主键的地址
innodb:聚集索引
采用B+树的数据索引结构:
与myisam不同的是,索引的本身就是数据的一部分,因此,每一个叶子节点都储存了完整的数据
主索引的查询:select * from user where id=?

辅助索引的查询:select * from user where name=?
实际上它首先是根据辅助索引查询到子节点中与辅助索引绑定的主索引,再根据主索引查询相当于执行了select * from user where id=(select id from user where name=?);
所以在innodb表中,当我们按主键查询时效率很高,但使用辅助索引的话效率就会很低;

本文介绍了MySQL中InnoDB和MyISAM两种引擎的主要区别,重点讨论了它们的索引实现原理。MyISAM使用非聚集索引,索引文件独立存储数据地址,而InnoDB采用聚集索引,索引本身就包含数据,导致主键查询高效,辅助索引查询相对较慢。
1281

被折叠的 条评论
为什么被折叠?



