MySQL引擎
- InnoDB ,常用
- MyIsam ,常用
- Memory(也叫HEAP)堆内存嘛
- Mrg_Myisam(分表的一种方式–水平分表)
- Blackhole(黑洞引擎)
InnoDB(默认的存储引擎)
结构
InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引,所谓“聚集”,就是指数据行和相邻的键值紧凑地存储在一起,注意 InnoDB 只能聚集一个叶子页(16K)的记录(即聚集索引满足一定的范围的记录),因此包含相邻键值的记录可能会相距甚远。
下图说明了 InnoDB聚集索引的实现方式,同时也体现了一张 innoDB表的结构,可以看到,InnoDB 中,主键索引和数据是一体的,没有分开。:
特点
- 支持事务:提供了对数据库ACID事务的支持,实现了SQL标准的四种隔离级别。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务。
- 有行级锁和外键约束,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。
- 但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
- 它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。全表扫描效率可能会低。
- Innodb不支持全文索引。
应用场景
- 经常更新的表,适合处理多重并发的更新请求。
- 支持事务。
- 可以从灾难中恢复(通过bin-log日志等)。
- 外键约束。只有他支持外键。
- 支持自动增加列属性auto_increment。
MyIsam(MySQL5.5版本之前默认)
MyISAM索引文件【.MYI (MYIndex)】和数据文件【.MYD (MYData)】是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。先来看看结构图
特点
- 不支持事务的设计:但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己的业务需求进行相应的控制。
- 不支持外键的表设计。
- 使用表级锁。
- 极度强调快速读取操作:MyISAM 默认会把索引读入内存,直接在内存中操作,查询速度很快。
- MyIASM中存储了表的行数。
- MyISAM支持全文索引。
适用场景
- 如果数据库insert和update的操作比较多的话比较适用。
- 整天对表进行加锁的场景。
- 极度强调快速读取操作。
什么是外键
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
区别和选择
主要区别:
- InnoDB支持事务,MyISAM不支持。
- InnoDB查询更慢,适合写多读少,MyISAM查询更快,适合读多写少。
- InnoDB聚集索引,MyISAM非聚集索引。
选择:
- 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
- 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
- 系统奔溃后,MyISAM恢复起来更困难,能否接受;
- MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。
原文链接:https://blog.csdn.net/len9596/article/details/80206532