MySQL的存储引擎

原文链接: https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

目录

    • 主要的数据库引擎
      • 特性对比
      • Federated

主要的数据库引擎

https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

  1. InnoDB

    MySQL 8.0中的默认存储引擎。 InnoDB是一种适用于MySQL的事务安全(支持ACID特性)存储引擎,具有提交,回滚和崩溃恢复功能,可保护用户数据。 InnoDB支持行级锁定和Oracle风格的一致非锁定读(consistent nonlocking reads)增加了多用户并发性和性能。 InnoDB将用户数据存储在聚簇索引中,以减少基于主键的常见查询的I/O. 为了保持数据完整性,InnoDB还支持FOREIGN KEY参照完整性约束。

  2. MyISAM

    这些表占用资源少。 表级锁定限制了读/写工作负载的性能,因此它通常用于Web和数据仓库配置中的只读或大部分读取工作负载。

  3. Memory

    将所有数据存储在RAM中,以便在需要快速查找非关键( non-critical)数据的环境中快速访问。 这个引擎的前身为HEAP引擎。 InnoDB及其缓冲池内存区域提供了一种通用且持久的方式来将大部分或全部数据保存在内存中,NDBCLUSTER为大型分布式数据集提供快速键值查找。

  4. CSV

    它的表实际上是逗号分隔值的文本文件。 CSV表允许您以CSV格式导入或转储数据,以便与读取和写入相同格式的脚本和应用程序交换数据。 由于CSV表没有索引,因此通常在正常操作期间将数据保留在InnoDB表中,并且仅在导入或导出阶段使用CSV表。

  5. Archive

    这些紧凑的无索引表旨在存储和检索大量很少使用的历史,存档或安全审计信息。

  6. Blackhole

    Blackhole存储引擎接收但不存储数据,类似于Unix /dev/null设备。 查询语句始终返回空集。 这些表可用于将DML语句发送到从属服务器的复制配置操作,但主服务器不保留其自己的数据副本。

  7. NDB(NDBCLUSTER)

    该聚集数据库引擎特别适用于需要尽可能高的正常运行时间和可用性的应用程序。

  8. Merge

    使MySQL DBA或开发人员能够对一系列相同的MyISAM表进行逻辑分组,并将它们作为一个对象引用。 适用于数据仓库等VLDB环境。

  9. Federated

    提供链接多个独立MySQL服务器创建一个逻辑数据库的功能。 非常适合分布式环境。

  10. Example

    该引擎作为MySQL源代码中的一个示例,说明了如何开始编写新的存储引擎。 它主要是开发人员感兴趣的。 存储引擎是一个什么都不做的“存根”。 您可以使用此引擎创建表,但不能在其中存储数据或从中检索数据。

特性对比

Feature MyISAM Memory InnoDB Archive NDB
B-tree indexes Yes Yes Yes No No
Backup/point-in-time recovery (note 1) Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Clustered indexes No No Yes No No
Compressed data Yes (note 2) No Yes Yes No
Data caches No N/A Yes No Yes
Encrypted data Yes (note 3) Yes (note 3) Yes (note 4) Yes (note 3) Yes (note 3)
Foreign key support No No Yes No Yes (note 5)
Full-text search indexes Yes No Yes (note 6) No No
Geospatial data type support Yes No Yes Yes Yes
Geospatial indexing support Yes No Yes (note 7) No No
Hash indexes No Yes No (note 8) No Yes
Index caches Yes N/A Yes No Yes
Locking granularity Table Table Row Row Row
MVCC No No Yes No No
Replication support (note 1) Yes Limited (note 9) Yes Yes Yes
Storage limits 256TB RAM 64TB None 384EB
T-tree indexes No No No No Yes
Transactions No No Yes No Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes

Federated

使用一个标准存储引擎(如MyISAM,CSV或InnoDB)创建表时,该表由表定义和对应数据组成。 创建FEDERATED表时,表定义相同,但数据的物理存储在远程服务器上处理。

FEDERATED表包含两个部分:

  • 具有数据库表的远程服务器,该数据库表又由表定义(存储在MySQL数据字典中)和相关的表组成。 远程表的表类型可以是远程mysqld服务器支持的任何类型,包括MyISAM或InnoDB。

  • 具有数据库表的本地服务器,其中表定义与远程服务器上的相应表的定义匹配。 表定义存储在数据字典中。 本地服务器上没有数据文件。 相反,表定义包括指向远程表的连接字符串。

在本地服务器上的FEDERATED表上执行查询和语句时,通常会从本地数据文件插入,更新或删除信息的操作将被发送到远程服务器执行,在那里他们更新远程服务器上的数据文件或从远程服务器返回匹配的行。

图16.2 FEDERATED表结构
MySQL的存储引擎_第1张图片

当客户端发出一个关于FEDERATED表的SQL语句时,本地服务器(执行SQL语句的位置)与远程服务器(物理存储数据的位置)之间的信息流如下:

  • 存储引擎查看FEDERATED表所具有的每个列,并构造引用远程表的相应SQL语句。
  • 使用MySQL客户端API将语句发送到远程服务器。
  • 远程服务器处理该语句,本地服务器检索该语句生成的任何结果(受影响的行计数或结果集)。
  • 如果语句生成结果集,则每列都将转换为FEDERATED引擎所期望的内部存储引擎格式,并可用于将结果显示给发出原始语句的客户端。

本地服务器使用MySQL客户端C API函数与远程服务器通信。 它调用mysql_real_query()来发送语句。 使用mysql_store_result()读取结果集,使用mysql_fetch_row()读取一行。

你可能感兴趣的:(数据库)