MyISAM和InnoDB的区别

前言

学习自用,有错麻烦提一下

正文

InnoDB是MySQL在...版本开始的默认引擎,

较大的区别是InnoDB支持事务,而MyISAM不支持事务(是没有事务的概念?这就是他只有表锁的原因?),

InnoDB支持意向锁,行锁,间隙锁等,而MyISAM只支持表锁

对于 他们的索引,InnoDB使用的是聚簇索引,意思是它的索引数据的物理顺序和索引列值顺序是一样的,同时聚簇索引的整列数据是放在B树叶子节点的,相比起来MyISAM的只在B树叶子节点存放数据列的指针,所以他们InnoDB的索引和数据列组成一个.idb文件,而MyISAM的索引和数据文件分开为两个.MYD和.MYI;

 

同时因为聚簇索引的这个性质,MyISAM会比较简单,它的数据排列顺序取决于插入顺序,也就是说直接往后添加数据,而InnoDB的插入需要保证和主键顺序一样速度才比较好,,所以InnoDB的主键一般设置为自增,这样在后面也不会触发叶子节点的分裂,这样就可以减少索引的维护代价。,相反的,如果在中间插入,就可能会导致页分裂(文章后面有讲页分裂),另外修改主键也会导致数据的移动

(InnoDB修改主键数据岂不是也要相应的去修改他们的辅助索引中的值?)

 

页分裂和页合并:

如果插入新的行 ID 值为 700,则只需要在 R5 的记录后面插入一个新记录。如果新插入的 ID 值为 400,就相对麻烦了,需要逻辑上挪动后面的数据,空出位置。如果 R5 所在的数据页已经满了,根据 B+ 树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去,这个过程称为页分裂。在这种情况下,性能自然会受影响。除了性能外,页分裂操作还影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,整体空间利用率降低大约 50%。

当然有分裂就有合并。当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程(页分裂和页合并没有图就太抽象了,分裂后的新页是分配在整个B+树的最后面?)

另外一点重建索引:

重建索引:

      由于数据页分裂和合并,或者数据被删除,数据页会存在一个空洞的位置,导致空间利用率不高。这个时候我们需要重建索引,提高页面的利用率,使索引更加紧凑。

(怎么操作?)

使用场景

从上面可以看出,MyISAM适合插入频繁的,比如说新闻数据库,这种读插频繁,且修改的操作不多(读还是InnoDB更快吧?)

且MyISAM不适合读写并发频繁的,因为它的表锁会导致阻塞

 

 

参考资料

  1. https://www.cnblogs.com/jiawen010/p/11805241.html
  2. https://www.cnblogs.com/ngrzr/p/11907386.html
  3. 页分裂的https://blog.csdn.net/qq_25827845/article/details/90736098

TODO

  1. MyISAM是设计成适合怎样的场景
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值