其他存储引擎 Memory / CSV / Archive

其他存储引擎 Memory / CSV / Archive

概述

除了 InnoDB 和 MyISAM,MySQL 还内置了 Memory、CSV、Archive 等存储引擎。它们在特定场景下有独特优势。

-- 查看所有支持的引擎
SHOW ENGINES;

Memory 引擎

特点

把所有数据存储在内存中,重启后数据丢失。

graph LR
    A[Memory引擎] --> B[数据在内存]
    A --> C[表结构在磁盘]
    B --> D[读写极快]
    B --> E[重启丢失]
    C --> F[服务启动后
空表结构存在]

适用场景

-- 场景1:临时中间表
CREATE TABLE temp_ranking ENGINE=MEMORY
AS SELECT user_id, SUM(score) AS total_score
FROM user_scores
GROUP BY user_id;

-- 场景2:字典/配置缓存
CREATE TABLE city_cache (
    city_id INT PRIMARY KEY,
    city_name VARCHAR(100),
    province VARCHAR(50)
) ENGINE=MEMORY;

SELECT * FROM city_cache WHERE city_id = 1;  -- 内存级速度

限制

-- 键限制:不支持BLOB/TEXT列
CREATE TABLE t (content TEXT) ENGINE=MEMORY;
-- ERROR 1163: The used table type doesn't support BLOB/TEXT columns

-- 文件大小限制:受 max_heap_table_size 控制
SHOW VARIABLES LIKE 'max_heap_table_size';
-- 默认 16MB

-- 表锁:并发写入差
-- 表锁而非行锁

对比 InnoDB 缓冲池

特性 Memory InnoDB Buffer Pool
数据来源 应用显式插入 磁盘自动加载
持久性 不持久 持久化到磁盘
表锁 行锁
用途 临时数据 数据缓存

CSV 引擎

特点

将数据以标准 CSV 格式存储在文件中,可以直接用编辑器查看。

CREATE TABLE csv_export ENGINE=CSV
AS SELECT id, name, email FROM users;

-- 查看文件
-- /var/lib/mysql/db/csv_export.CSV
# 实际文件内容
1,张三,zhangsan@example.com
2,李四,lisi@example.com

适用场景

-- 数据交换:导出数据给其他系统
CREATE TABLE data_exchange ENGINE=CSV
AS SELECT * FROM source_table;

-- 其他系统可以直接读取 CSV 文件

-- 注意:CSV 引擎不支持索引!
CREATE INDEX idx_name ON data_exchange (name);
-- ERROR: CSV engine does not support indexes

限制

  • ❌ 不支持索引
  • ❌ 不支持分区
  • ❌ 不支持 NULL(默认用空字符串代替)
  • ❌ 不支持自增
  • ⚠️ 插入性能差(逐行追加)

Archive 引擎

特点

使用 zlib 压缩 存储,压缩比极高。只支持 INSERT 和 SELECT,不支持 UPDATE 和 DELETE。

-- 创建归档表
CREATE TABLE log_archive (
    id INT AUTO_INCREMENT,
    log_time DATETIME,
    message TEXT,
    PRIMARY KEY (id)
) ENGINE=ARCHIVE;
特性
压缩比 80-90%(10GB → 1-2GB)
INSERT ✅ 支持(批量插入极快)
SELECT ✅ 支持(仅全表扫描)
UPDATE/DELETE ❌ 不支持
索引 ✅ 支持主键和二级索引(8.0+)
行锁 ❌ 仅表锁

适用场景

-- 日志归档
-- 把7天前的热数据归档到Archive表
INSERT INTO log_archive
SELECT * FROM active_logs
WHERE created_at < NOW() - INTERVAL 7 DAY;

DELETE FROM active_logs
WHERE created_at < NOW() - INTERVAL 7 DAY;

-- 后续查询归档数据
SELECT COUNT(*) FROM log_archive
WHERE log_time BETWEEN '2024-01-01' AND '2024-01-31';
-- 虽然慢,但数据量被压缩80%,磁盘友好

引擎选型对比

flowchart TD
    A{数据特点} --> B{需要持久化?}
    B -->|| C[Memory引擎]
    B -->|| D{需要索引?}
    D -->|| E{只读归档?}
    E -->|| F[Archive引擎]
    E -->|| G{CSV导出?}
    G -->|| H[CSV引擎]
    G -->|| I[InnoDB]
    D -->|是| J[InnoDB]

实践建议

-- Memory + InnoDB 组合用法
-- 先缓存到 Memory 做快速计算,再持久化到 InnoDB

-- 1. 创建Memory临时表
CREATE TABLE tmp_rank ENGINE=MEMORY
SELECT user_id, SUM(revenue) AS total
FROM daily_sales
WHERE sale_date = CURDATE()
GROUP BY user_id;

-- 2. 做计算(极快)
UPDATE tmp_rank SET rank = @r:=@r+1;

-- 3. 持久化结果
INSERT INTO daily_rank
SELECT * FROM tmp_rank;

-- 4. 清理
DROP TABLE tmp_rank;

面试要点

  • Memory 引擎:速度快但重启丢失,不支持 BLOB/TEXT
  • CSV 引擎:数据交换友好,但不支持索引
  • Archive 引擎:超高压缩比,仅 INSERT/SELECT,适合日志归档
  • 生产建议:大多数场景还是用 InnoDB,这些引擎在特殊需求时使用

一句话总结:InnoDB 是”日常通勤车”,Memory/CSV/Archive 是”工具车”——各有专攻,别用反了。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容