1.分析B树
相关概念
度数:在树中,每个节点的子节点(子树)的个数就称为该节点的度(degree)。
阶数:(Order)阶定义为一个节点的子节点数目的最大值。(自带最大值属性)
B-Tree
B+Tree
B+Tree与B-Tree区别
叶子节点之间都有一个链指针,不需要遍历整棵树就可以得到所存储的全部数据,在进行范围查找的时候非常方便。
B+Tree非叶子节点只存储索引index不存储data,所以同样大小的磁盘页可以容纳更多的节点元素
Mysql底层结构
image.pngInnoDB
主键索引
辅助索引/联合索引
image.png
MyISAM
主键索引
辅助索引/联合索引
image.png
InnoDB与MyISAM区别
1.存储格式
InnoDB:.frm存储表结构文件,字段长度等 .ibd文件存储数据信息和索引信息
MyISAM: .frm 描述表结构文件,字段长度等 .MYD(MYData)数据信息文件,存储数据信息
.MYI(MYIndex)索引信息文件
2.数据结构
InnoDB与MyISAM底层都是采用B+Tree进行存储,但是对于InnoDB来说B+Tree叶子节点存储的是表的整条
数据,对于MyISAM来说叶子节点存储的是数据的地址
3.事务
InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要
原因之一;
4.锁
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和
更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因
之一
5.表的具体行数
MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count() from table;就会遍历整个表,消耗相当大,
但是在加了wehre条件后,myisam和innodb处理的方式都一样。
6. AUTO_INCREMENT
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动
加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的
行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
7. 全文索引
MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
8.表主键
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的
一部分,附加索引保存的是主索引的值的数据列。
9.CURD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE从性
能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果
要清空保存有大量数据的表,最好使用truncate table这个命令。
10. 外键
MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如
事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。
另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优
势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
网友评论