数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行 创建、查询、更新和删除数据。
不同的存储引擎提供不同的存储机制、索引技巧、锁定 水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管 理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
查看当前 mysql 的默认引擎
show variables like '%engine%';
查看 mysql 支持哪些引擎
show engines;
修改默认存储引擎 如果修改本次会话的默认存储引擎(重启后失效),只对本会话有效,其他会话无效:
set default_storage_engine = innodb;
修改全局会话默认存储引擎(重启后失效),对所有会话有效
set global default_storage_engine = innodb;
查看mysql 默认隔离级别
show variables like '%tx_isolation%';
InnoDB
InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作 非常大的数据存储提供了一个强大的解决方案。
InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:
优点:
- 更新密集的表。 InnoDB存储引擎特别适合处理多重并发的更新请求。
- 支持多版本并发控制的行级锁,由于锁粒度小,写操作和更新操作并发高、速度快
- 适合于大容量数据库系统,
- 事务。 InnoDB存储引擎是支持事务的标准MySQL存储引擎。
- Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别
- 自动灾难恢复。 与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
- 外键约束。 MySQL支持外键的存储引擎只有InnoDB。
- 支持自动增加列AUTO_INCREMENT属性。
- 从5.5开始innodb存储引擎成为默认的存储引擎。
缺点:
- 它没有保存表的行数 SELECT COUNT(*) FROM TABLE时需要扫描全表
应用场景
- 当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以 在并发较高时,使用 Innodb引擎会提升效率。
- 更新密集的表, InnoDB.存储引擎特别适合处理 多重并发的更新请求 一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。
MylSAM
MyISam引擎不支持事务、也不支持外键, 优势是访问速度快,对事务完整性没有要求或者以 select, Insert为主的应用基本上可以用这个引擎来创建表·
优点
- MyISAM表是独立于操作系统的,这说明可以轻松地将其从 windows服务器移植到Liux服务器
- MyISAM存储引擎在查询大量数据时非常迅速,这是它最突出的优点
- 另行大批量插入操作时执行速度也比较快
缺点
间隙锁 行锁 表锁
- MyISAM表没有提供对数据库事务的支持。
- 不支持行级锁和外键。
- 不适合用于经常 UPDATE(更新)的表
应用场景
-
以读为主的业务,例如:图片信息数据库,博客数据库,商品库等业务
-
对数据一致性要求不是非常高的业务(不支持事务)
-
硬件资源比较差的机器可以用 MyISAM(占用资源少)
MEMORY
MEMORY的特点是将表中的数据放在内存中,适用于存储临时数据的临时表和数据仓库中的纬度表
优点
- memory类型的表访问非常的快,因为它的数据是放在内存中的
缺点
-
一旦服务关闭,表中的数据就会丢失掉
-
只支持表锁,并发性能差,
-
不支持TEXT和BLOB列类型,
-
存储 varchar时是按照char的方式
应用场景
-
目标数据较小,而且被非常频繁地访问。
-
如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
-
存储在 Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响
存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:
-
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现 并发控制,InnoDB是一个好的选择
-
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
-
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将 数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的 中间结果
-
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操 作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可 以使用Archive
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能 和实际需求,使用合适的存储引擎,将会提高整个数据库的性能。