前言
学习自用,有错麻烦提一下
正文
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不适合读写并发频繁的,因为它的表锁会导致阻塞
参考资料
- https://www.cnblogs.com/jiawen010/p/11805241.html
- https://www.cnblogs.com/ngrzr/p/11907386.html
- 页分裂的https://blog.csdn.net/qq_25827845/article/details/90736098
TODO
MyISAM是设计成适合怎样的场景