MySQL存储引擎有哪些(非常详细)
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。
在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一张表使用不同的存储引擎。MySQL 支持的存储引擎有 InnoDB、MyISAM、Memory、NDB、Merge、Archive、Federated、CSV、BLACKHOLE 等。
可以使用 SHOW ENGINES 语句查看系统所支持的存储引擎类型,结果如下:
查看当前默认的存储引擎,可以使用下面的语句:
值得注意的是,不管使用哪种数据存储引擎,都使用了高速缓存,数据库在读取 .frm 文件信息后会将表的信息缓存起来,以提高服务器下次读取数据的速度。
不同的存储引擎都有各自的特点,以适应不同的需求,常用存储引擎的对比情况如下表所示。
使用哪一种引擎要根据需要灵活选择,一个数据库中的多张表可以使用不同引擎,以满足各种性能和实际需求。使用合适的存储引擎,将会提高整个数据库的性能。
MySQL 数据库在创建表的时候,可以添加默认的存储引擎,示例如下:
更改表的存储引擎的语法格式如下:
【实例】将数据表 books 的存储引擎修改为 InnoDB。
1) 在修改存储引擎之前,先使用 SHOW CREATE TABLE查看表 tb_deptment3 当前的存储引擎,结果如下:
2) 接下来修改存储引擎类型,SQL 语句如下:
使用 SHOW CREATE TABLE 再次查看表books的存储引擎。
在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一张表使用不同的存储引擎。MySQL 支持的存储引擎有 InnoDB、MyISAM、Memory、NDB、Merge、Archive、Federated、CSV、BLACKHOLE 等。
可以使用 SHOW ENGINES 语句查看系统所支持的存储引擎类型,结果如下:
mysql> SHOW ENGINES \G
*************************** 1. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 5. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 8. row ***************************
Engine: ndbinfo
Support: NO
Comment: MySQL Cluster system information storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 9. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 10. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 11. row ***************************
Engine: ndbcluster
Support: NO
Comment: Clustered, fault-tolerant tables
Transactions: NULL
XA: NULL
Savepoints: NULL
Support 列的值表示某种引擎是否能使用:YES 表示可以使用,NO 表示不能使用,DEFAULT 表示该引擎为当前默认存储引擎。查看当前默认的存储引擎,可以使用下面的语句:
mysql> SHOW VARIABLES LIKE '%storage_engine%'; +---------------------------------+-----------+ | Variable_name | Value | +---------------------------------+-----------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_mem_storage_engine | TempTable | +---------------------------------+-----------+尽管 MySQL 数据库支持多种数据存储引擎,但是不管使用哪种存储引擎,所有的存储数据都被记录到 .frm 文件中,该文件还记录了表的一些属性值。
值得注意的是,不管使用哪种数据存储引擎,都使用了高速缓存,数据库在读取 .frm 文件信息后会将表的信息缓存起来,以提高服务器下次读取数据的速度。
不同的存储引擎都有各自的特点,以适应不同的需求,常用存储引擎的对比情况如下表所示。
| 特点 | InnoDB | MyISAM | Memory | Merge | Archive |
|---|---|---|---|---|---|
| 存储限制 | 64TB | 有 | 有 | 没有 | 没有 |
| 事务安全 | 支持 | ||||
| 锁机制 | 行锁 | 表锁 | 表锁 | 表锁 | 表锁 |
| B树索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 哈希索引 | 支持 | ||||
| 全文索引 | 支持 | ||||
| 集群索引 | 支持 | ||||
| 数据缓存 | 支持 | 支持 | |||
| 索引缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 数据可压缩 | 支持 | 支持 | |||
| 空间使用 | 高 | 低 | N/A | 低 | |
| 内存使用 | 高 | 低 | 中等 | 低 | 表锁 |
| 批量插入速度 | 低 | 高 | 高 | 高 | 支持 |
| 支持外键 | 支持 |
- 如果要提供提交、回滚和崩溃恢复能力的事务安全(ACID 兼容)能力,并要求实现并发控制,InnoDB 是一个很好的选择;
- 如果数据表主要用来插入和查询记录,则 MyISAM 存储引擎能提供较高的处理效率;
- 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的 Memory 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果;
- 如果只有 INSERT 和 SELECT 操作,可以选择 Archive 存储引擎,它支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。
使用哪一种引擎要根据需要灵活选择,一个数据库中的多张表可以使用不同引擎,以满足各种性能和实际需求。使用合适的存储引擎,将会提高整个数据库的性能。
MySQL 数据库在创建表的时候,可以添加默认的存储引擎,示例如下:
create table books( id int, name varchar(20) not null )engine=MyISAM default charset= utf8mb4;
更改表的存储引擎的语法格式如下:
ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
【实例】将数据表 books 的存储引擎修改为 InnoDB。
1) 在修改存储引擎之前,先使用 SHOW CREATE TABLE查看表 tb_deptment3 当前的存储引擎,结果如下:
mysql> SHOW CREATE TABLE books \G
*************************** 1. row ***************************
Table: books
Create Table: CREATE TABLE `books` (
`id` int DEFAULT NULL,
`name` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
可以看到,表 books 当前的存储引擎为 NGINE=MyISAM。2) 接下来修改存储引擎类型,SQL 语句如下:
mysql> ALTER TABLE books ENGINE=InnoDB;
使用 SHOW CREATE TABLE 再次查看表books的存储引擎。
mysql> SHOW CREATE TABLE books \G
*************************** 1. row ***************************
Table: books
Create Table: create table `books` (
`id` int DEFAULT NULL,
`name` varchar(20) NOT NULL
) ENGINE= InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
表 books 的存储引擎变成了“InnoDB”。
ICP备案:
公安联网备案: