MySQL中的各种存储引擎

本文详细介绍了MySQL中的存储引擎,包括InnoDB、MyISAM、Archive、Blackhole、CSV和Memory等,分析了它们的特点、优缺点及适用场景。InnoDB作为默认引擎,支持事务处理和行级锁,适合高并发应用;而MyISAM则以快速访问和简洁的表结构为特点,适用于读多写少的场景。此外,还讨论了如何查看和设置默认存储引擎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、存储引擎介绍

为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能。所以在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。

也就是:

  • MySQL中的数据用各种不同的技术存储在文件中每一种技术都使用不同的存储机制索引技巧锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
  • MySQL数据库中的组件,负责执行实际的数据I/O操作
  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
     

二、查看存储引擎

通过命令查看mysql提供了哪些存储引擎:

show engines;

如下:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| 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         |
| 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         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

三、常见存储引擎

1.InnoDB

优点:

  • 支持外键。
  • 支持事务,支持4个事务隔离级别,保证数据的完整性。
  • 支持行级锁。
  • InnoDB是为处理巨大数据量的最大性能设计。
    • 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除 了。比如: .frm , .par等都在MySQL8.0中不存在了,只有一个.ibd的文件,用于存放索引和数据(在InnoDB中索引即数据)

缺点:

  • 对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引。
  • MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较高 ,而且内存大小对性能有决定性的影响。

除非有非常特别的原因需要使用其他的存储引擎,否则一般都优先考虑InnoDB引擎。

2.MyISAM

特点:

  • MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级 锁、外键 ,有一个毫无疑问的缺陷就是崩溃后无法安全恢复 。
  • 优势是访问的速度快 ,对事务完整性没有要求或者以SELECT、INSERT为主的应用。
  • 表级锁定形式,数据在更新时锁定整个表
  • 数据文件的结构为:
    • 表名.frm 存储表结构
    • 表名.MYD 存储数据 (MYData)
    • 表名.MYI 存储索引 (MYIndex)
  • 应用场景:只读应用或者以读为主的业务

和InnoDB存储引擎的一个对比:

对比项MyISAMInnoDB
外键不支持支持
事务不支持支持
行表锁表锁,即使操作一条记录也会锁住 整个表,不适合高并发的操作行锁,操作时只锁某一行,不对其它行有影响, 适合高并发的操作
缓存只缓存索引,不缓存真实数据不仅缓存索引还要缓存真实数据,对内存要求较 高,而且内存大小对性能有决定性的影响
关注点性能:节省资源、消耗少、简单业 务事务:并发写、事务、更大资源

3.Archive

  • 用于数据的存档,仅仅支持插入和查询两种功能,不支持修改删除
  • 拥有很好的压缩机制,使用zlib压缩库,数据体积非常小
  • 再创建ARCHIVE表时,数据文件的扩展名为.ARZ
  • 支持行级锁
  • Archive表适合日志和数据采集类应用,适合存储大量的独立的作为历史记录的数据。有很高的插入速度,但是对查询的支持较差

4.Blackhole

  • 没有任何的存储机制,它会丢弃所有的插入数据,不做任何保存,读操作会返回空内容
  • 但服务器会记录blackhole表的日志,所以可以用于复制数据到备库,或简单地记录到日志

5.CSV

  • 存储数据时,以逗号分隔各个数据项
  • CSV引擎数据存储的就是.CSV后缀的文件,可以直接使用EXCEL打开
  • CSV可以作为一种数据交换的机制
  • 对于数据的快速导入、到处有明显优势

CSV表每个字段都不能为空

6.Memory

Memory采用的逻辑介质是内存响应速度很快 ,数据易丢失 。另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。

  • 同时支持哈希(HASH)索引和B+树索引。
  • Memory表至少比MyISAM表要快一个数量级 。
  • Memory表的大小是受到限制的。表的大小主要取决于两个参数,分别是 max_rows 和max_heap_table_size 。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
  • 数据文件与索引文件分开存储,表的结构存储在.frm文件中,数据放在内存中
  • 缺点:其数据易丢失,生命周期短。

7.Federated

  • 访问远程表
  • Federated引擎是访问其他MySQL服务器的一个代理 ,尽管该引擎看起来提供了一种很好的 跨服务器的灵活性 ,但也经常带来问题,因此默认是禁用的 。

8.Merge

  • 管理多个MyISAM表构成的表集合

9.NDB

  • MySQL集群专用存储引擎

四、设置系统默认的存储引擎

show variables like '%storage_engine%';
#或
SELECT @@default_storage_engine;

结果为:

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 |
+---------------------------------+-----------+

如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。 修改默认存储引擎:

SET DEFAULT_STORAGE_ENGINE=MyISAM

或者修改 my.cnf 文件:

default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值