MariaDB存储引擎 #
一、存储引擎概述 #
1.1 什么是存储引擎 #
text
存储引擎概念
├── 数据存储和检索的底层实现
├── 决定表的特性
│ ├── 事务支持
│ ├── 锁粒度
│ ├── 索引类型
│ └── 存储格式
└── 可以为不同表选择不同引擎
1.2 查看存储引擎 #
sql
-- 查看支持的存储引擎
SHOW ENGINES;
-- 查看默认存储引擎
SELECT @@default_storage_engine;
-- 查看表的存储引擎
SHOW TABLE STATUS LIKE 'users';
SELECT ENGINE FROM information_schema.tables WHERE table_name = 'users';
二、InnoDB引擎 #
2.1 InnoDB特点 #
text
InnoDB特点
├── 事务支持
│ ├── ACID特性
│ └── 行级锁
├── 外键约束
├── 崩溃恢复
├── MVCC(多版本并发控制)
├── 聚簇索引
└── 缓冲池
2.2 创建InnoDB表 #
sql
-- 创建InnoDB表(默认)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
) ENGINE=InnoDB;
-- 显式指定
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;
2.3 InnoDB配置 #
ini
[mysqld]
# 缓冲池大小(物理内存的50-70%)
innodb_buffer_pool_size = 4G
# 缓冲池实例数
innodb_buffer_pool_instances = 4
# 日志文件大小
innodb_log_file_size = 512M
# 日志缓冲区
innodb_log_buffer_size = 16M
# 刷新策略
innodb_flush_log_at_trx_commit = 1
# 刷新方法
innodb_flush_method = O_DIRECT
# 文件格式
innodb_file_per_table = 1
2.4 InnoDB监控 #
sql
-- 查看InnoDB状态
SHOW ENGINE INNODB STATUS;
-- 查看缓冲池状态
SHOW STATUS LIKE 'Innodb_buffer_pool%';
-- 查看行锁
SHOW STATUS LIKE 'Innodb_row_lock%';
三、Aria引擎 #
3.1 Aria特点 #
text
Aria特点
├── MariaDB增强的MyISAM
├── 支持崩溃恢复
├── 页级缓存
├── 支持事务(部分)
├── 更好的并发性能
└── 内部临时表默认引擎
3.2 创建Aria表 #
sql
-- 创建Aria表
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
message TEXT,
created_at DATETIME
) ENGINE=Aria;
-- 创建带事务支持的Aria表
CREATE TABLE temp_data (
id INT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=Aria TRANSACTIONAL=1;
3.3 Aria配置 #
ini
[mysqld]
# Aria缓存大小
aria_pagecache_buffer_size = 128M
# 日志文件大小
aria_log_file_size = 1G
# 日志级别
aria_log_level = 1
3.4 Aria vs MyISAM #
| 特性 | Aria | MyISAM |
|---|---|---|
| 崩溃恢复 | 支持 | 不支持 |
| 事务 | 部分支持 | 不支持 |
| 缓存 | 页级缓存 | 键缓存 |
| 性能 | 更好 | 一般 |
| 推荐使用 | 是 | 否 |
四、ColumnStore引擎 #
4.1 ColumnStore特点 #
text
ColumnStore特点
├── 列式存储
├── 数据压缩
├── 大数据分析
├── 并行查询
├── 适合OLAP场景
└── 不适合OLTP场景
4.2 创建ColumnStore表 #
sql
-- 创建ColumnStore表
CREATE TABLE analytics (
id INT,
event_date DATE,
user_id INT,
event_type VARCHAR(50),
amount DECIMAL(10,2)
) ENGINE=ColumnStore;
-- 列式存储优势
-- 1. 只读取需要的列
-- 2. 更高的压缩比
-- 3. 适合聚合查询
4.3 ColumnStore使用场景 #
sql
-- 适合:聚合分析
SELECT
event_date,
event_type,
COUNT(*) AS event_count,
SUM(amount) AS total_amount
FROM analytics
WHERE event_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY event_date, event_type;
-- 不适合:频繁更新
-- ColumnStore适合批量导入,不适合频繁的单行更新
五、Spider引擎 #
5.1 Spider特点 #
text
Spider特点
├── 分布式存储
├── 透明访问远程表
├── 支持分片
├── 支持XA事务
└── 适合水平扩展
5.2 创建Spider表 #
sql
-- 创建远程服务器
CREATE SERVER remote_server
FOREIGN DATA WRAPPER mysql
OPTIONS (
HOST '192.168.1.100',
DATABASE 'mydb',
USER 'spider',
PASSWORD 'password'
);
-- 创建Spider表
CREATE TABLE remote_users (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=Spider
COMMENT='wrapper "mysql", srv "remote_server", table "users"';
-- 查询远程表
SELECT * FROM remote_users;
5.3 Spider分片 #
sql
-- 创建分片表
CREATE TABLE sharded_orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2)
) ENGINE=Spider
COMMENT='wrapper "mysql", table "orders"'
PARTITION BY HASH (user_id) (
PARTITION p1 COMMENT='srv "server1"',
PARTITION p2 COMMENT='srv "server2"',
PARTITION p3 COMMENT='srv "server3"'
);
六、Memory引擎 #
6.1 Memory特点 #
text
Memory特点
├── 数据存储在内存中
├── 极快的访问速度
├── 支持Hash索引
├── 不支持事务
├── 不支持BLOB/TEXT
└── 重启后数据丢失
6.2 创建Memory表 #
sql
-- 创建Memory表
CREATE TABLE session_data (
session_id VARCHAR(32) PRIMARY KEY,
user_id INT,
data TEXT,
created_at DATETIME
) ENGINE=Memory;
-- 使用Hash索引
CREATE TABLE lookup (
id INT PRIMARY KEY,
name VARCHAR(50),
KEY USING HASH (name)
) ENGINE=Memory;
6.3 Memory使用场景 #
sql
-- 适合:临时数据、缓存
-- 会话存储
CREATE TABLE sessions (
id VARCHAR(32) PRIMARY KEY,
data TEXT,
expires INT
) ENGINE=Memory;
-- 查询缓存
CREATE TABLE query_cache (
query_hash VARCHAR(32) PRIMARY KEY,
result TEXT,
expires INT
) ENGINE=Memory;
七、MyISAM引擎 #
7.1 MyISAM特点 #
text
MyISAM特点
├── 不支持事务
├── 表级锁
├── 全文索引
├── 空间索引
├── 崩溃恢复能力弱
└── 适合只读场景
7.2 创建MyISAM表 #
sql
-- 创建MyISAM表
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200),
content TEXT,
FULLTEXT INDEX ft_content (content)
) ENGINE=MyISAM;
-- 全文搜索
SELECT * FROM articles
WHERE MATCH(content) AGAINST('database');
八、其他引擎 #
8.1 CSV引擎 #
sql
-- CSV引擎:存储为CSV文件
CREATE TABLE csv_data (
id INT,
name VARCHAR(50),
email VARCHAR(100)
) ENGINE=CSV;
INSERT INTO csv_data VALUES (1, 'John', 'john@example.com');
-- 数据存储为CSV文件
-- /var/lib/mysql/mydb/csv_data.CSV
8.2 Archive引擎 #
sql
-- Archive引擎:归档存储
CREATE TABLE archived_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
message TEXT,
created_at DATETIME
) ENGINE=Archive;
-- 特点:
-- 1. 高压缩比
-- 2. 只支持INSERT和SELECT
-- 3. 适合日志归档
8.3 Blackhole引擎 #
sql
-- Blackhole引擎:黑洞,数据不存储
CREATE TABLE blackhole_data (
id INT PRIMARY KEY,
data VARCHAR(100)
) ENGINE=BLACKHOLE;
-- 用途:
-- 1. 复制过滤
-- 2. 性能测试
-- 3. 审计日志
九、引擎选择 #
9.1 选择指南 #
| 场景 | 推荐引擎 |
|---|---|
| OLTP(事务处理) | InnoDB |
| OLAP(数据分析) | ColumnStore |
| 临时数据 | Memory |
| 日志归档 | Archive |
| 全文搜索 | InnoDB(支持全文索引) |
| 分布式存储 | Spider |
9.2 转换引擎 #
sql
-- 转换表引擎
ALTER TABLE users ENGINE=InnoDB;
-- 注意:转换过程会锁表
-- 大表转换建议使用pt-online-schema-change
十、总结 #
引擎对比:
| 引擎 | 事务 | 锁 | 适用场景 |
|---|---|---|---|
| InnoDB | 支持 | 行级 | OLTP |
| Aria | 部分 | 表级 | 通用 |
| ColumnStore | 不支持 | 表级 | OLAP |
| Spider | 支持 | 行级 | 分布式 |
| Memory | 不支持 | 表级 | 临时数据 |
| MyISAM | 不支持 | 表级 | 只读 |
最佳实践:
- 默认使用InnoDB
- 根据场景选择引擎
- 大表转换注意锁表
- 定期监控引擎状态
下一步,让我们学习JSON函数!
最后更新:2026-03-27