InnoDB与MyISAM的多种区别与选择

InnoDB与MyISAM作为MySQL中的存储引擎,无论是在我们学习数据库方面,还是在面试方面,都是很重要的一点。他们俩可以从多个方面的区别进行了解。
1、外键

InnoDB支持外键,而MyISAM是不支持的。如果将InnoDB类型的表转换为MyISAM类型的话,是会转换失败的。

2、索引

InnoDB是聚集索引,使用B+树作为索引结构。必须要有主键,通过主键索引效率会很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键过大的话,索引也要增大。
MyISAM是非聚集索引,它的索引与数据文件是分开的。InnoDB的索引与数据文件是绑在一块进行存储的。

3、存储文件

在上面说了InnoDB是聚集索引。而MyISAM是非聚集索引,它的索引与数据文件是分开存储的,什么意思呢?先看下MyISAM表在电脑中如何存储的:
在这里插入图片描述
其中.frm文件是存储的表的框架结构,它的名字与表的名字是一样的。无论是MyISAM还是InnoDB,都是有这个文件的。MYD文件存放的是表的数据。MYI文件存放的是表的索引。MyISAM它是非聚集索引,就是把这个索引与表中的数据分开存储了。因此不难想象,非聚集索引的话呢,是将索引与数据放在两个文件中,那么聚集索引就是将数据与索引放在一个文件中。InnoDB的存储文件有.frm、.ibd。.frm与MyISAM一样,都是存放的表的框架结构。

4、事务

InnoDB支持事务,而且5.5版本之后,MySQL默认的存储引擎就是InnoDB了。而MyISAM不支持事务

5、全文索引

在MySQL5.7版本之前,InnoDB是不支持全文索引的,在5.7版本之后,InnoDB就支持索引了。MyISAM则是支持全文索引

6、是否存储表中行数

InnoDB不保存表的具体行数,比如在执行select count(*) from table时,会进行全表扫描。而MyISAM中内置了一个计数器,这个计数器存放了表中的行数,在查询表中的行数时,直接从计数器中获取即可。

7、锁的支持

InnoDB支持行锁、表锁,默认是行锁。MyISAM支持表锁。表锁指的是锁住的是整张表。在InnoDB中,它的行锁锁的是索引,而不是对整行数据进行加锁,如果在访问数据的时候,如果访问没有命中索引,也无法使用行锁,那么InnoDB就会退化到表锁。

8、是否有唯一索引

InnoDB必须要有唯一索引(如主键id),而MyISAM可以没有。InnoDB推荐自增id作为主键,因为索引的底层数据结构为B+树,使用自增的id的话,能够避免B+树的频繁合并与重排

9、数据的删除

InnoDB删除数据时是一行一行进行删除的,而MyISAM删除数据时则是重新建表

如何选择哪种存储引擎?

1、如果要支持事务,那么肯定是要选择InnoDB的,毕竟MyISAM是不支持事务的。而过不要求事务的话,可以考虑MyISAM。
2、如果在使用的时候,读操作占用了大多数,那么MyISAM是比较合适的,如果读写的比例差不多,那么InnoDB更合适
3、系统崩溃后,MyISAM恢复的速度是要比InnoDB慢的,
4、5.5版本后,默认的存储引擎就是InnoDB了,所以,大部分情况下,InnoDB是够用的。

PS:最大ID
向表中新增20条数据,删除3条数据后,重启数据库,再新增一条数据,那么这条数据的id是多少呢?

从InnoDB与MyISAM两种存储引擎方面来说。如果是InnoDB的话,因为InnoDB是将数据存放到内存中,重启数据库会导致最大ID丢失,再新增数据的时候,会从当前最大值还是累加,所以InnoDB此时的id为18.
MyISAM将数据信息存放到文件中,再重启数据库的时候,重新读取文件获取文件中数据的最大值,在此基础上进行操作即可,所以MyISAM引擎的话是21

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值