对InnoDB和MyISAM存储引擎的理解

最近在看mysql优化内容,发现对sql语句优化跟存储引擎还有一定的联系。
所以就打算写一篇关于InnoDB和MyISAM存储引擎的区别

目录

  1. 如何选择合适的存储引擎?
  2. InnoDB和MyISAM的区别
  3. InnoDB特有的结构

1.如何选择合适的存储引擎?

MyISAM
该应用是以读和插入操作为主,很少有更新删除操作,对事务的完整性,并发性要求不高。
InnoDB
可用于事务处理程序,支持外键。对事务完整性和并发性有要求。支持事务提交和回滚

2. InnoDB和MyISAM的区别

1、存储方式
MyISAM: 在硬盘上为存储三个文件
1.以.frm结尾的文件,存储表的定义
2.以.MYD(MYData)结尾的文件,存储数据
3.以.MYI(MYIndex)结尾的文件,存储索引
InnoDB:数据和索引都存储在一个文件里,也可能是多个文件,或者是独立的表空间文件

2、索引叶节点存储类型

MyISAM:索引的叶节点存储的是指针,可**快速查询指定数据**。

InnoDB:二级索引的叶节点存储的是主键。
    why?为什么InnoDB索引存储的是主键?
    这种存储方式,利用空间换取效率。缺点在于存储主键占有了空间,优点是每次数据移动时,不需要去维护索引表。
    查询操作需要二级查找,所以查询的性能不高。可用覆盖索引以及延迟关联的方法避免二次查找 

3、锁策略
MyISAM: 利用的是表锁
InnoDB: 利用的是行锁或表锁

表锁:
    顾名思义就是对整张表进行锁定。
    读读操作不锁,读写以及写写操作会加锁。(可设置Concurrent_insert参数,可控制查和插入操作不被锁)。
    根据调度优先级,写操作优先于读操作。若大量的写操作,会造成读操作阻塞,甚至会很出现读饿死的情况。
    表锁的粒度大,竞争锁的情况多,减少了并发性处理量。

行锁
    顾名思义是对当行记录进行锁定
    行锁是对索引字段加锁,若where字段没有索引,则会用表锁。select操作是不上锁的。
    当写操作进行锁定时,读操作用的是一致性的非锁定快照读,也就是数据库隔离级别策略。
    所以不会出现读写饿死的情况。
    又因为锁的粒度小,使用的是行,竞争相同锁的情况就少了所以增加了并发处理。

2. InnoDB特有的结构

1、聚簇索引
聚簇索引

术语“聚簇”表示数据行和相邻的键值紧凑的存储在一起。
因为无法将数据行放在两个地方,所以一个表中只能有一个聚簇索引。
聚簇索引的叶节点存储主键,事务ID,回滚指针,其他数据列的。
存储事务以及回滚指针,说明可以支持事务,回滚特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值