Mysql 中MyISAM和InnoDB的区别与实现:
区别:
- InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从MyISAM变成 InnoDB 的重要原因之一。
- InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为MyISAM 会失败。
- InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。
- 执行大量select,MyISAM是最好的选择;执行大量的update和insert最好用 InnoDB。 InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行查询语句时只需要读出该变量即可,速度很快。
- MyISAM在磁盘上存储上有三个文件.frm(存储表定义) .myd(存储表数据) .myi(存储表索引); InnoDB磁盘上存储的是表空间数据文件和日志文件,innodb表大小只受限于操作系统大小。
- delete from table时, InnoDB会一行一行的删除。
- MyISAM使用非聚集索引,索引和数据分开,只缓存索引,InnoDB使用聚集索引,索引和数据存在一个文件。
查询实现:
MyISAM:
该索引是由B+树构成,执行查询操作的时候会先对B+树进行查询,如果找到对应的叶子节点,则会取出叶子节点的值(地址),通过地址查到整行数据。

Innodb
主索引搜索时
下图是Innodb主索引查找的示意图,可以看出叶子节点包含了完整的数据记录,这种索引方式叫做聚集索引。因为InnoDB的数据文件本身是按照主键聚集的,索引InnoDB要求表中必须拥有主键(MyISAM中可以没有),如果没有显示指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,类型为长整型long该字段长度为6个字节。

辅助索引搜索时
这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

本文详细探讨了MySQL中的两种主要存储引擎——MyISAM和InnoDB的区别。InnoDB提供事务处理和外键支持,而MyISAM则不支持。在锁粒度上,InnoDB采用行级锁,MyISAM采用表级锁,影响了并发性能。InnoDB适合大量更新操作,MyISAM在纯查询场景下表现更优。此外,InnoDB的索引是聚集索引,数据与索引存储在一起,而MyISAM索引和数据分离。在删除操作上,InnoDB逐行删除,MyISAM一次性删除整表。
1104

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



