MySql 中 Innodb 与 MyISAM 两种存储引擎对比

两种存储引擎都是 Mysql 常用的,从 5.7之后 Mysql 默认把存储引擎改为 Innodb

一 、区别:
  1. 事务和外键

    Innodb 具有事务,支持4中隔离级别,回滚,崩溃修复和多版本并发的事务安全,包括 ACID ,如果应用中需要大量的 INSERT 或 UPDATE 操作,则应该选择 Innodb 引擎,这样可以提供多用户并发操作的性能;还具备全文索引的能力

    MyISAM 管理非事务表,它提供高速存储和检索,以及全文搜索能力。如果应用中需要大量的 SELECT 查询,那么 MyISAM 是最好的选择

  2. Innodb 支持行级锁定,但也不是绝对的,如果执行的 SQL 语句时 mysql不能确定扫描的范围,Innodb 表同样会锁全表

  3. 索引

    Innodb 使用聚簇索引,索引的就是数据,顺序存储

    MyISAM 使用的是非聚簇索引,索引和文件是分开的

二、MyISAM 索引实现
MyISAM 使用B+树作为索引结构。叶节点的 data 区域存放的是数据记录的地址:


20150527164101257.png

这里设表一共有三列,假设我们以 Col1 为主键,则上图是一个 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的key可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示:


20150527165118887.png

同样也是一颗 B+Tree ,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法为首先按照 B+ Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其data 域的值,然后以 data 域的值为地址,读取相应数据记录。
MyISAM 的索引方式也叫做“非聚集”的,之所以这么称呼是为了与 InnoDB 的聚集索引区分。
三、Innodb 索引实现

InnoDB 也使用 B+ Tree 作为索引结构,但具体实现方式却与 MyISAM 截然不同;

第一个重大区别是 Innodb 的数据文件本身就是索引文件。从上文知道 MyISAM 索引文件和数据文件是分开的,索引文件仅保存数据记录的地址。而在 Innodb 中,表数据本身是按 B+ Tree 组织的索引结构。这棵树的叶子结点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 Innodb 表数据文件本身就是主索引


20150527165207200.png

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

第二个与 MyISAM 索引的不同是 InnoDB 的辅助索引 data 域存储相应记录主键的值而不是地址。换句话说,InnoDB 的所有辅助索引都引用主键作为 data 域。例如,下图为定义在 Col3 上的一个辅助索引:


20150527165108176.png

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

四、查找案例

如若使用 where id = ‘13’ 这样的条件去查找主键,则按照 B+ 树的检索算法即可查找对应的叶子节点,之后便可获取到数据。若对 Name 列进行条件搜索,则需要两个步骤:第一步在辅助索引 B+ 树中检索 Name , 到达其叶子节点获取对应的主键。第二步使用主键在主索引 B+ 树中执行一次 B+ 树检索操作,最终到达其叶子节点即可获取整行数据;

两种索引结构查找过程如下:


image.png

你可能感兴趣的:(MySql 中 Innodb 与 MyISAM 两种存储引擎对比)