超详细的MySQL存储引擎讲解,学习MySQL这些知识你必须要会!
存储引擎
MySQL 是一个广泛使用的关系型数据库管理系统,它支持多种存储引擎,每种引擎都有自己独特的特点和适用场景。这些存储引擎决定了数据如何在数据库中存储、检索和管理的机制。
默认引擎
首先我们要知道,在创建表的时候,如果没有执行该表的存储引擎的话,那么默认采用那种存储引擎
的方式呢?
其实是跟MySQL
的版本
有关
- 在
MySQL 5.5及之后
的版本中,默认的存储引擎是InnoDB
。InnoDB是一个事务型存储引擎,它提供了事务安全表(ACID兼容)、行级锁定和外键等特性。这使得InnoDB成为许多需要高性能和事务支持的应用场景的首选。 - 在
MySQL 5.5之前
的版本中,默认的存储引擎是MyISAM
。MyISAM是一个非事务型存储引擎,它提供了较高的插入和查询速度,但不支持事务和外键。因此,它更适合于那些以读取操作为主、不需要事务支持的应用场景。
InnoDB
特点:
- 事务支持:InnoDB 支持 ACID(原子性、一致性、隔离性、持久性)事务特性,是 MySQL 默认的存储引擎。
- 行级锁定:InnoDB 使用行级锁定,可以高并发地处理事务,适用于写操作频繁的应用。
- 外键支持:InnoDB 支持外键约束,可以维护数据的完整性。
- 崩溃恢复:InnoDB 有强大的崩溃恢复能力,能够在系统崩溃后自动恢复数据。
- MVCC(多版本并发控制):InnoDB 通过 MVCC 实现高效的并发控制。
查看当前默认引擎
要查看当前MySQL服务器支持的存储引擎以及默认的存储引擎,可以使用以下SQL语句:
SHOW ENGINES;
可以看到InnoDB引擎是DEFAULT(默认),所以InnoDB引擎是当前数据库的默认存储引擎
Engine | Support | Comment | Transactions | XA | Savepoints |
---|---|---|---|---|---|
FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
MyISAM | YES | MyISAM storage engine | NO | NO | NO |
CSTORE | NO | Supports column store | NULL | NULL | NULL |
MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
CSV | YES | CSV storage engine | NO | NO | NO |
ARCHIVE | YES | Archive storage engine | NO | NO | NO |
设置存储引擎
在查询结果中,DEFAULT关键字标识的引擎就是当前默认的存储引擎。此外,当在创建表时,可以通过ENGINE子句来明确指定表的存储引擎,
CREATE TABLE my_table (
id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL
) ENGINE=InnoDB;
在上面的代码中,我们明确指定了表的存储引擎为InnoDB。如果没有指定ENGINE子句,那么将使用MySQL服务器当前的默认存储引擎。
适用场景:
- 需要事务支持的应用。
- 写操作频繁,并发要求高的应用。
- 数据完整性要求高的应用。
MyISAM
特点:
- 不支持事务:MyISAM 不支持事务和外键。
- 表级锁定:MyISAM 使用表级锁定,在写操作时锁定整个表,不适合高并发写操作。
- 全文索引:MyISAM 支持全文索引,适合全文搜索。
- 读取速度快:MyISAM 在读取速度方面通常比 InnoDB 快,特别是读取大量数据时。
适用场景:
- 读操作频繁,写操作较少的应用。
- 不需要事务支持的应用。
- 需要全文搜索的应用。
Memory
特点:
- 存储在内存中:Memory 存储引擎将数据存储在内存中,因此读写速度非常快。
- 不支持持久化:由于数据存储在内存中,服务器重启后数据会丢失,适用于临时数据存储。
- 表级锁定:Memory 引擎使用表级锁定。
- 哈希索引和 B 树索引:Memory 引擎支持哈希索引和 B 树索引,默认使用哈希索引。
适用场景:
- 临时数据存储。
- 需要快速访问的数据。
- 不需要持久化存储的数据。
NDB (Clustered)
特点:
- 分布式存储:NDB 是 MySQL Cluster 的存储引擎,支持分布式存储和复制。
- 高可用性和可扩展性:NDB 提供高可用性和可扩展性,适用于大型分布式系统。
- 内存存储:NDB 也将数据存储在内存中,因此读写速度很快。
适用场景:
- 需要高可用性和可扩展性的分布式系统。
- 高并发读写操作。
- 实时数据处理。
Archive
特点:
- 压缩存储:Archive 存储引擎提供压缩存储,适用于存储历史数据或日志数据。
- 只读:Archive 引擎是只读的,不支持更新和删除操作。
- 高效的插入操作:Archive 引擎在插入操作方面非常高效。
适用场景:
- 历史数据或日志数据的存储。
- 需要压缩存储以节省空间的应用。
CSV
特点:
- 文本存储:CSV 存储引擎将数据存储在逗号分隔值的文本文件中,易于导入导出。
- 可读性强:CSV 文件是文本格式,易于阅读和编辑。
- 不支持索引:CSV 引擎不支持索引,查询性能较差。
适用场景:
- 数据导入导出。
- 需要将数据存储在可读性强、易编辑的文件中的场景。
Federated
特点:
- 分布式访问:Federated 存储引擎允许 MySQL 服务器访问远程 MySQL 服务器上的表,类似于分布式数据库。
- 无缝集成:Federated 引擎使得访问远程表就像访问本地表一样简单。
适用场景:
- 分布式数据库系统。
- 需要跨多个 MySQL 服务器访问数据的场景。
TokuDB
特点:
- 压缩存储:TokuDB 提供高效的压缩存储,节省存储空间。
- 高并发写入:TokuDB 支持高并发写入,适合写操作频繁的应用。
- 事务支持:TokuDB 支持事务特性。
适用场景:
- 需要高效压缩存储的应用。
- 写操作频繁,并发要求高的应用。
选择存储引擎的建议
- 根据具体的应用场景选择最合适的存储引擎。
- 如果需要事务支持和数据完整性,选择 InnoDB。
- 如果读操作频繁且不需要事务支持,可以选择 MyISAM。
- 临时数据存储和快速访问可以选择 Memory。
- 需要分布式存储和高可用性可以选择 NDB。
- 历史数据和日志存储可以选择 Archive。