MyISAM与InnoDB存储引擎的区别

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的数据更好恢复。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值