05 InnoDB和MyISAM区别

1. InnoDB存储引擎特点
  1. InnoDB是Mysql默认的事务型存储引擎,支持事务的ACID特性。InnoDB每一条SQL语句都默认封装成事务,自动提交。最好使用BEGIN显式地开启事务,使用COMMIT提交事务。
  2. 支持行锁和表锁,默认是行锁。可以只对一行数据加锁,并发性能好。
  3. 采用MVCC多版本并发控制的方式来读取正在执行写操作的行数据,不需要等待行上X锁的释放,可以避免读写操作的相互阻塞,提高了并发性能。(具体原理是读取该行之前版本的数据,叫做快照数据,是通过undo段实现的。读取快照数据不需要上锁,极大地提高了数据库的并发性。InnoDB默认设置下默认的读取方式。)(并且实现了四种隔离级别,默认级别是可重复读,而且通过间隙锁策略防止幻读的出现,间隙锁不仅锁定查询涉及的行,还会锁定索引中的间隙,来防止幻影行的插入。)
  4. InnoDB表是基于聚集索引建立的,数据按照主键的逻辑顺序存储,一般用自增列来做主键,这样每次插入的新数据会顺序添加到当前索引节点的后续位置,形成一个紧凑的索引结构,近似顺序填满的,也不需要移动数据,所以不会增加很多开销在维护索引上。
  5. 支持B+树索引和自适应Hash索引,InnoDB 5.6后也支持了全文索引。自适应Hash索引的策略是当InnoDB注意到某些索引值被使用的非常频繁时,它会在内存中基于B+树索引之上再创建一个哈希索引。这样就可以让B+树索引也具有哈希索引的一些优点。
  6. 支持外键,外键用于和别的表进行关联来保持数据的一致性,比如A表中的一个字段,是B表的主键,那这个字段就是A表的外键。
  7. (不用说)InnoDB 还有一些关键特性,比如加速插入操作的插入缓冲区、加速读操作的自适应哈希索引、异步IO(AIO)
2. MyISAM存储引擎特点
  1. MyISAM不支持事务
  2. 不支持行级锁,采用的表锁设计。读操作使用共享锁,写操作使用排它锁,读写操作会相互阻塞,因此MyISAM存储引擎不适合在高并发的读写混合场景中使用。
  3. 支持B+树索引,全文索引。InnoDB 5.6才开始支持全文索引。
  4. 不支持外键
  5. 崩溃后无法安全恢复。
  6. 以堆表的方式存储数据,所以存储的数据是没有顺序的,索引的叶子节点直接指向数据的物理地址,避免了二次查找,MyISAM的查询性能会好于InnoDB的查询性能。
  7. MyISAM中,数据和索引是分别存储的,数据存储在MYD文件中,索引存储在MYI文件中。
  8. 使用场景: 读操作远远大于写操作的场景;不需要使用事务的场景;
3. MySQL中 MyISAM 和 InnoDB 的区别有哪些?如何选择?
  1. InnoDB是MySQL默认的存储引擎,支持事务,MyISAM不支持事务,InnoDB每一条SQL语句都默认封装成事务,自动提交,这样会影响速度,所以最好使用BEGIN显式地开启事务,使用COMMIT提交事务。
  2. 支持行锁和表锁,默认是行锁。可以只对一行数据加锁,并发性能好。而MyISAM只支持表锁。
  3. InnoDB支持外键,外键用于和别的表进行关联来保持数据的一致性,比如A表中的一个字段,是B表的主键,那这个字段就是A表的外键。MyISAM不支持外键。
  4. 支持自适应Hash索引,当InnoDB注意到某些索引值被使用的非常频繁时,它会在内存中基于B+树索引之上再创建一个哈希索引,这样就让B+树索引也具有哈希索引的一些优点了,比如O(1)时间复杂度的快速哈希查找。MyISAM没有这种机制。
  5. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。
  6. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  • 如何选择
    1、是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
    2、如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB;
    3、系统奔溃后,MyISAM恢复起来更困难,能否接受;???为啥
4. InnoDB是如何实现事务的????
  • 实现事务的原子性:通过回滚日志 Undo Log 来记录数据修改前的状态,如果事务执行失败,就通过Undo Log中的记录对数据进行回滚。
  • 实现事务的一致性:通过重做日志 Redo Log 来记录数据修改后的状态,如果判断出数据异常,就需要进行回滚。
  • 实现事务的隔离性:通过对事务操作的数据进行加锁来实现,有共享锁和排他锁,保证了事务提交前对其他事务都不可见。
  • 实现事务的持久性:如果数据库崩溃,就通过配合使用 Undo Log 和 Redo Log 对事务进行恢复,以此来保证事务的持久性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值