MySQL存储引擎

本文深入解析MySQL中的多种存储引擎,包括MyISAM、InnoDB、CSV、Archive、Memory和Federated的特点、适用场景及对比。从数据压缩、索引类型到事务处理,全面覆盖不同业务需求。

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

  • 看你的mysql现在已提供什么存储引擎:

show engines;

  • 看你的mysql当前默认的存储引擎:

show variables like ‘%storage_engine%’;

MyISAM

特点

  • 并发性与锁级别-表级锁
  • 支持全文检索
  • 支持数据压缩

组成

.frm 文件是任何存储引擎都会有的文件,用来存储表结构
.MYD 是数据文件,存储表数据
.MYI 是索引文件,存储表索引
因为数据和索引是分开储存的,因此MyISAM的索引是非聚集索引(如果是存放在一个文件中,则为聚集索引)。

MySql 5.5之前默认的存储引擎
MyISAM 存储引擎由MYD和MYI组成

create table testmyisam (
id int PRIMARY key
) ENGINE=myisam ;
insert into testmyisam VALUES(1),(2),(3);

表压缩

myisampack -b -f /usr/local/mysql/data/mall/testmysam.MYI

压缩后再往表里面新增数据就新增不了(官方文档写的是新增不了,但实际上有的时候可以新增)

insert into testmysam VALUES(1),(2),(3)

压缩后,需要

myisamchk -r -f /usr/local/mysql/data/mall/testmysam.MYI

适用场景

  • 非事务型应用(数据仓库,报表,日志数据)
  • 只读类应用
  • 空间类应用(空间函数,坐标)

由于现在innodb越来越强大,myisam已经停止维护
(绝大多数场景都不适合)

Innodb ☆

特点

  • Innodb是一种事务性存储引擎
  • 完全支持事务的ACID特性
  • Redo Log 和 Undo Log
  • Innodb支持行级锁(并发程度更高)

组成

.frm
.ibd

系统表空间和独立表空间

  • 系统表空间无法简单的收缩文件大小
  • 独立表空间可以通过optimize table 收缩系统文件
  • 系统表空间会产生IO瓶颈
  • 独立表空间可以同时向多个文件刷新数据

mysql5.6以前默认为系统表空间
建议:Innodb使用独立表空间(5.7默认)

show variables like ‘%innodb_file_per_table%’;
ON:独立的表空间:tablename.ibd
OFF:系统表空间:ibdataX

适用场景

Innodb适合于大多数OLTP应用。

OLTP,On-Line Transaction Processing,联机事务处理过程,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一。

对比MyISAM

在这里插入图片描述

CSV

特点

  • 以csv格式进行数据存储
  • 所有列都不能为null的(创建时要加not null)
  • 不支持索引(不适合大表,不适合在线处理)
  • 可以对数据文件直接编辑(保存文本文件内容)

组成

.csv 文件存储内容
.csm 文件存储表的元数据,如表状态和数据量
.frm 表结构

创建

create table mycsv(id int not null,c1 VARCHAR(10) not null,c2 char(10) not null) engine=csv;
insert into mycsv values(1,‘aaa’,‘bbb’),(2,‘cccc’,‘dddd’);

修改文本数据

vi /usr/local/mysql/data/mall/mycsv.CSV

刷新表

flush TABLES;
select * from mycsv;

create index idx_id on mycsv(id)#失败,不支持索引

Archive

特点

  • 只支持insert和select操作
  • 只允许在自增ID列上加索引
  • 以zlib对表数据进行压缩,磁盘I/O更少

组成

.frm
.ARZ 存储数据

create table myarchive(id int auto_increment not null,c1 VARCHAR(10),c2 char(10), key(id)) engine = archive;
INSERT into myarchive(c1,c2) value(‘aa’,‘bb’),(‘cc’,‘dd’);
create index idx_c1 on myarchive(c1);#失败,只允许在自增ID列上加索引
delete from myarchive where id = 1;#失败,不支持delete
update myarchive set c1=‘aaa’ where id = 1;#失败,不支持update

使用场景

日志和数据采集应用

Memory

特点

  • 文件系统存储特点
    也称HEAP存储引擎,所以数据保存在内存中
  • 支持HASH索引和BTree索引
  • 所有字段都是固定长度 varchar(10) = char(10)
  • 不支持Blog和Text等大字段
  • Memory存储引擎使用表级锁
  • 最大大小由max_heap_table_size参数决定

查看最大大小

show VARIABLES like ‘max_heap_table_size’;#1M

create table mymemory(id int,c1 varchar(10),c2 char(10),c3 text) engine = memory;#失败,因为不支持大字段
create table mymemory(id int,c1 varchar(10),c2 char(10)) engine = memory;
create index idx_c1 on mymemory(c1);#HASH索引
create index idx_c2 using btree on mymemory(c2);#BTree索引
show index from mymemory;
show TABLE status LIKE ‘mymemory’;

对比临时表

临时表可以由自己或者系统创建。
系统在max_heap_table_size范围内会创建Memory表,超过了会创建MyISAM表。

使用场景

  • hash索引用于查找或者是映射表(邮编和地区的对应表)
  • 用于保存数据分析中产生的中间表
  • 用于缓存周期性聚合数据的结果表

Ferderated

特点

  • 提供了访问远程MySQL服务器上表的方法
  • 本地不存储数据,数据全部放到远程服务器上
  • 本地需要保存表结构和远程服务器的连接信息

使用场景

偶尔的统计分析及手工查询(某些游戏行业)

默认禁止,启用需要再启动时增加federated参数

参考:Deer——mysql优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值