MySQL的InnoDB和MyISAM比较

InnoDB和MyISAM数据库引擎是MySQL数据库最常用的两个引擎,所以接触比较多,在这里就来用我自己的理解归纳总结下。
一、先就各引擎对一些功能支持与否进行梳理:
(1)MyISAM:
支持:
1.大量查询操作
2.表锁
3.支持 Btree、Full-text 等索引
4.支持没有主键和唯一索引
5.更适合分区表
不支持:
1.大量写操作
2.事务
3.外键
4.不支持 Hash 索引

MyISAM的注意点:
1.MyISAM数据文件和索引文件分开,所以数据插入速度极快。
2.索引存储的[key,value]中的key可表示主索引也可表示辅助索引,value存储的数据域中的内容是数据实际物理地址,指向数据文件中的实际位置。

(2)InnoDB:
支持:
1.大量写操作
2.行锁
3.事务
4.外键
5.支持 Btree、Hash 等索引
不支持:
1.全文索引(FULLTEXT)

InnoDB的注意点:
1.InnoDB的数据文件和索引文件是在一起的。
2.索引存储的[key,value]中的key表示的是数据表的主键,这是由于innodb的数据文件本身就是主索引,value存储的是实际数据,这样就能看出innodb存储引擎的查询效果非常好。
3.InnoDB的要求表必须有主键,就算没有主键或合适的唯一索引innodb也会自己产生一个隐藏的行id值为6字节的行id聚集索引。原因就在于InnoDB的数据文件本身要按主键聚集。
4.innodb的所有辅助索引都引用主键作为data域,data域存储相应记录主键的值而不是地址。
5.innodb默认索引结构是B+Tree(也是表数据文件的结构),这棵树的叶节点data域保存了完整的数据记录。

二、下面分析下上面的内容:
锁、事务、索引、分区表等知识我在别的文章中有说明,可进行查阅。
(1)为什么说MySIAM引擎上面所说的适合大量读而不适合大量写操作?
这是在读写操作并存的情况下得出的结论(这是相对的),根据便是MyISAM的表锁机制牵扯的表锁调度问题,MyISAM中写进程会使都进程等待,如果有大量写进程,那么读进程就可能被长时间滞留,所以才会有“适合大量读而不适合大量写操作”的结论,当读操作远远多于写操作时才不会出现长期读操作长期滞留的情况。
当然,我们都知道MyISAM数据库的数据文件和索引文件是分开的,所以MyISAM的数据插入速度极快。
(2)为什么说MyISAM更适合分区表呢?
这是因为myisam支持没有主键和唯一索引,因为当使用分区表的时候,如果有主键和唯一索引,那么分区键中就必须包含主键和唯一索引。
(3)InnoDB中事务的实现原理?
首先,我们知道事务具有ACID四个特性。也即:原子性,一致性,隔离性,持久性。
ACD三个特性是通过Redo log(重做日志)和Undo log 实现的。 而隔离性是通过锁来实现的。具体原理另述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值