MySQL 存储引擎

98 阅读5分钟

MySQL 存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(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

 使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能 和实际需求,使用合适的存储引擎,将会提高整个数据库的性能。