最近在看mysql优化内容,发现对sql语句优化跟存储引擎还有一定的联系。
所以就打算写一篇关于InnoDB和MyISAM存储引擎的区别
目录
- 如何选择合适的存储引擎?
- InnoDB和MyISAM的区别
- 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,回滚指针,其他数据列的。
存储事务以及回滚指针,说明可以支持事务,回滚特性。