MySQL 存储引擎(InnoDB、MyISAM、MEMORY)

什么是存储引擎?

MySQL 中的数据用各种不同的技术存储在文件(或者内存)中。

这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。

通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型

MySQL提供了插件式的存储引擎架构。所以MySQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎。

mysql5.6 支持的存储引擎

包括 InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、 ARCHIVE、PERFORMANCE_SCHEMA。其中 NDB 和 InnoDB 提供事务安全表,其他存储引擎都是非事务安全表
# 查询当前数据库支持的存储引擎 :
show engines;
# 查看当前的默认存储引擎: 
show variables like '%engine%';

# 修改一个已经存在的表的存储引擎:
alter table 表名 engine = 引擎名;
# 创建表并且指定引擎:
create table t3 (id int,name char(4)) engine=memory; #(engine = "指定引擎")

在配置文件中指定:default-storage-engine=INNODB # 在 my.ini 文件下的 [mysqld]

各种存储引擎的特性

  • 并发性:某些应用程序比其他应用程序具有很多的颗粒级锁定要求(如行级锁定)。
  • 事务支持:并非所有的应用程序都需要事务,但对的确需要事务的应用程序来说,有着定义良好的需求,如ACID兼容等。
  • 引用完整性:通过DDL定义的外键,服务器需要强制保持关联数据库的引用完整性。
  • 物理存储:它包括各种各样的事项,从表和索引的总的页大小,到存储数据所需的格式,到物理磁盘。
  • 索引支持:不同的应用程序倾向于采用不同的索引策略,每种存储引擎通常有自己的编制索引方法,但某些索引方法(如B-tree索引)对几乎所有的存储引擎来说是共同的。
  • 内存高速缓冲:与其他应用程序相比,不同的应用程序对某些内存高速缓冲策略的响应更好,因此,尽管某些内存高速缓冲对所有存储引擎来说是共同的(如用于用户连接的高速缓冲,MySQL的高速查询高速缓冲等),其他高速缓冲策略仅当使用特殊的存储引擎时才唯一定义。
  • 性能帮助:包括针对并行操作的多I/O线程,线程并发性,数据库检查点,成批插入处理等。
  • 其他目标特性:可能包括对地理空间操作的支持,对特定数据处理操作的安全限制等。

常用存储引擎介绍及适用场景

InnoDB 存储引擎

用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性, 数据操作除了插入和查询之外,还包括很多更新和删除操作,那么 InnoDB 存储引擎是比较合适的。

InnoDB 除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚, 对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。

InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。

# mysql5.6 以上默认存储方式

# 存储的文件个数:表结构、表中的数据

# 支持行级锁、支持表级锁,修改数据多(行级锁效率很低)

# 支持事务(开启事务不能再分,执行不成功回滚)

# 支持外键(外键:主要做数据关联。由于外键的约束,删除的时候要先删除关联)

MyISAM 存储引擎

如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。

MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。

# mysql5.5 以下默认存储方式

# 存储的文件个数:表结构、表中的数据、索引

# 支持表级锁

# 不支持行级锁,不支持事务,不支持外键

MEMORY 存储引擎

将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。

Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失。

# 存储的文件个数:表结构

# 优势:增删改查都很快

# 劣势:重启数据消失、容量有限

ARCHIVE 引擎 (了解)

拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩。 支持最基本的插入和查询两种功能。在MySQL 5.5开始支持索引。 不支持事务。支持行级锁和专用的缓存区,所以可以实现高并发的插入。 适合存储大量日志、历史数据。

BLACKHOLE 引擎 (了解)

黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。

接受但不存储数据,但是如果MySQL启用了二进制日志,SQL语句被写入日志(并被复制到从服务器)。 用于做日志记录或同步归档的中继存储。但这种应用方式会碰到很多问题,因此并不推荐。 支持事务,而且支持mvcc的行级锁。

CSV 引擎 (了解)

每个表会生成一个.CSV文件,将CSV类型的文件当做表进行处理。 把数据以逗号分隔的格式存储在文本文件中,这种文件是一种普通文本文件,每个数据行占用一个文本行。 不支持索引,即使用该种类型的表没有主键列,也不允许表中的字段为null。

NDB 引擎 (了解)

又名 NDBCLUSTER,这种集群数据引擎尤其适合于需要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前能够支持。

posted @ 2022-08-07 22:48  鹿先森JIAN  阅读(175)  评论(0编辑  收藏  举报