当前位置:Gxlcms > 数据库问题 > mysql myisam 和 innodb 的区别

mysql myisam 和 innodb 的区别

时间:2021-07-01 10:21:17 帮助过:6人阅读

  • 外键方面

    innodb 支持外键,而 myisam 不支持。对一个包含外键的 innodb 表转为 myisam 会失败。

  • 索引层面

    innodb 是聚簇索引,myisam 是非聚簇索引

    myisam 支持 fulltext类型的全文索引, innodb 不支持 FULLTEXT 类型的全文索引,但是 innodb 可以使用 sphinx 插件支持全文索引,并且效果更好。

  • 锁粒度方面

    innodb 最小的锁粒度是 行锁 ,myisam 最小的锁粒度是 表锁

    一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。

  • 硬盘存储结构

    myisam 在磁盘上存储成三个文件

    • . frm 文件存储表的定义
    • 数据文件 的扩 展名为 . MYD (MYData)。
    • 索引文件 的扩 展名是 . MYI (MYIndex)。

    innodb 存储引擎存储数据库数据,一共有两个文件(没有专门保存数据的文件):

    • Frm 文件:表的定义文件。
    • Ibd 文件:数据和索引存储文件。数据以主键进行聚集存储,把真正的数据保存在叶子节点中。

  • 2. 局簇索引和非局簇索引的区别

    1. 聚簇索引(innodb)

      数据 存储与 索引 放到了一块,索引结构的 叶子节点 保存了 行数据

      表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。

      innodb 中,在聚簇索引之上创建的索引称之为辅助索引,像复合索引、前缀索引、唯一索引等等。

      • 聚簇索引默认是主键,
      • 如果表中没有定义主键,innodb 会选择一个 唯一的非空索引 代替。
      • 如果没有这样的索引,innodb 会在内部生成一个名为 GEN_CLUST_INDEX 的隐式的聚簇索引。
    2. 非聚簇索引(MyISAM)

      数据索引 分开存储,表数据存储顺序与索引顺序无关


    2. 索引查询过程

    1. 非聚簇索引存储结构(MyISAM)

      技术图片
      MyISAM的 B+树 的叶子节点上,记录的是真实数据的存储地址。

      比如通过主键id查询,MyISAM查询流程如下:

      • 根据id值在B+树上找到相应的叶子节点
      • 取出叶子节点上的数据存储地址
      • 根据数据存储地址,去找到相应的真实数据

      通过主键id查询的时候,InnoDB比MyIsam快一些,因为InnoDB只需要一次B+树查找就能取出数据。MyIsam通过B+树查找到地址后,还需要根据地址去查询真正的数据

      还比如说在数据重构的时候,MyIsam记录的是数据地址,那么重构数据的时候地址就要重新生成一遍,这也是有问题的。

      InnoDB重构数据的时候就不会这样,因为他记录的是主键id,地址会变化,主键id是不会变的。

    2. 聚簇索引存储结构(innodb)

      技术图片
      InnoDB的 B+树 的叶子节点上,记录的是真实行数据。

      比如通过主键id查询,InnoDB查询流程如下:

      聚簇索引(主键索引):

      • 根据id值在B+树上找到相应的叶子节点
      • 取出叶子节点上的行数据,返回即可

      辅助索引(聚簇索引以外的):

      • 在相应索引的B+树上找到相应的叶子节点
      • 取出叶子节点上的数据,该数据是主键id
      • 拿到主键id后,去主键索引的B+树上找到相应的叶子节点
      • 取出叶子节点上的行数据,返回

    mysql myisam 和 innodb 的区别

    标签:col   sam   没有   image   取出   表数   定义   style   变化   

    人气教程排行