MyISAM与InnoDB存储引擎的区别

2023-12-24 10:50:06

1、InnoDB支持事务,MyISAM不支持事务;

2、InnoDB支持外键,MyISAM不支持外键;

3、InnoDB和MyISAM的索引都是由B+树数据结构实现的,它俩索引的不同为:InnoDB根据索引是否与数据进行绑定将索引分成了聚簇索引和非聚簇索引,InnoDB有一个规定是,表中的每一行数据必须要与某一个索引进行绑定,这个跟数据进行绑定的索引被叫做聚簇索引,InnoDB会首选主键作为聚簇索引,如果这张表没有主键,就选择一个唯一索引作为聚簇索引,如果连唯一索引都没有,MySQL就为这张表创建一个Row_id字段作为聚簇索引。那么聚簇索引是怎么跟数据进行绑定的呢?我们知道一张表中可以有多个索引,每个索引都有自己的B+树结构,但是只有聚簇索引会将数据存储在自己的B+树的叶子节点上,所以当我们基于聚簇索引进行查询的时候,能够直接查询到数据,聚簇索引的查询效率很高,而非聚簇索引的B+树的叶子节点上存储的不是数据,是聚簇索引的值,当我们基于一个非聚簇索引进行查询时,首先查到的是聚簇索引的值,再根据聚簇索引查到数据,非聚簇索引的查询效率不如聚簇索引高,但是一张表中只能有一个聚簇索引,可以有多个非聚簇索引。MyISAM不支持聚簇索引,它是将索引跟数据分开存储的,索引的B+树的叶子节点上存储的是数据的地址,通过索引查询数据时,还要再经过一次寻址才能查到数据。

当我们使用的是InnoDB存储引擎时,我们应该为每张表设计一个主键字段,并且这个字段不宜过大,因为它将被作为聚簇索引,如果聚簇索引过大的话,也会导致非聚簇索引过大。

4、锁的粒度方面的区别:InnoDB支持行锁和表锁,默认行锁;MyIsam只支持表锁,不支持行锁。

5、MyISAM有一个变量专门用来存储每张表中的记录数,InnoDB没有这样的变量,所以在执行select count(*) from user;这样的查询语句时,MyISAM直接在这个变量中取值,查询速度很快,而InnoDB需要进行全表扫描,不如MyISAM快,不过执行带where条件的count查询时,MyISAM也需要进行全表扫描,就不能在这个变量中取了。InnoDB之所以没有这样的变量,是因为它支持事务,当我们为InnoDB的事务设置不同的隔离级别时,这个查询结果是不同的,所以存储这样的变量是没有意义的。

6、在查询效率方面的区别:MyISAM的查询效率高于InnoDB,但写操作的效率不如InnoDB,当我们需要实现的功能只有查询操作时,可以用MyISAM,既有读又有写,就用InnoDB,低版本的MySQL默认使用MyISAM,从MySQL5.5开始,默认存储引擎改成了InnoDB。

7、在全文索引的支持方面:全文索引对于有全文检索需求的应用很有帮助,MyISAM是支持全文索引的,而InnoDB存储引擎从MySQL5.7开始也对全文索引做了支持。当然全文索引只支持使用在char、varchar、text类型的字段上。

8、在数据恢复方面的区别:当MySQL服务发生了崩溃时,MyISAM的数据不好恢复,InnoDB的数据更好恢复。

文章来源:https://blog.csdn.net/qq_39350797/article/details/135178383
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。