MySQL两大存储引擎索引区别 | 青训营笔记

84 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

MySQL常见的存储引擎为MyISAM和InnoDB,二者的区别在于:

myisam不支持事务,innodb支持事务

myisam只支持表锁,innodb支持表锁和行锁

myisam不支持外键,innodb支持外键

索引实现不一样。虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。

InnoDB 引擎中,其数据文件本身就是索引文件。

相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。

对于二者使用索引检索时,也有很多差别,具体根据情况可以分为:

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

    优点:查询速度非常快,对排序查找和范围查找优化
    缺点:依赖于有序的数据,更新代价大

非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置

    优点:更新代价比聚簇索引要小 
    缺点:依赖于有序的数据,可能会二次查询(回表)
        不一定回表查询的情况:
            覆盖索引:如果一个索引包含(或者说覆盖)所有需要查询的字段的值
                    主键索引本身的 key 就是主键,查到直接返回即可

MyISAM 引擎中,B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。即非聚簇索引(非聚集索引)。

InnoDB 引擎中,其数据文件本身就是索引文件。其表数据文件本身就是按 B+Tree 组织的一个索引结构, 树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引,即聚簇索引(聚集索引)。

主键索引:InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的(数据:地址值)。 辅助索引:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。