Skip to content

MySQL 存储引擎

MySQL中的数据用各种不同的技术存储在文件系统中,每一种技术都使用不同的存储机制、索引技巧,锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。

存储引擎就是MySQL 讲数据存储在文件系统中的存储方式或者存储格式目前MySQL 常用的两种存储引擎:MyISAM、InnoDB

MySQL 存储引擎是MySQL 数据库服务器中的组件,负责为数据库执行实际的数据I/O操作,使用特殊存储引擎的主要优点之一在于,仅需提供特殊应用所需的特性,数据库中的系统开销较小,具有更有效和更高的数据库性能。MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

存储引擎分类

mermaid
graph TD
    A[存储引擎] --> B[事务型]
    A --> C[非事务型]
    B --> D[InnoDB]
    B --> E[NDB Cluster]
    C --> F[MyISAM]
    C --> G[MEMORY]
    C --> H[ARCHIVE]

InnoDB

MySQL 5.7+是MySQL的默认存储引擎

  • 支持ACID事务(隔离级别可配置)
  • 行级锁定(MVCC实现并发控制)
  • 外键约束支持
  • 崩溃恢复能力(WAL日志机制)
  • 聚簇索引组织表

MyISAM

典型场景

  • 只读/读密集型操作
  • 数据仓库应用
  • 需要全文索引(MySQL 5.6前)

局限性

  • 表级锁定(并发性能差)
  • 无事务支持
  • 崩溃后恢复困难
  • 不支持外键

MEMORY引擎

  • 数据存储在内存中
  • 临时表/高速缓存场景
  • 服务器重启后数据丢失

ARCHIVE引擎

  • 高压缩比(约10:1)
  • 只支持INSERT/SELECT
  • 适合日志归档

NDB Cluster引擎

  • 分布式内存数据库
  • 99.999%高可用性
  • 实时性要求高的场景

InnoDB与MyISAM 对比

特性InnoDBMyISAM
事务支持完整ACID事务不支持
锁机制行级锁、MVCC表级锁
外键支持不支持
崩溃恢复自动恢复(Redo/Undo)手动修复
索引结构聚簇索引非聚簇索引
COUNT(*)需扫描表缓存计数
全文索引5.6+支持原生支持
存储文件.ibd表空间.frm、.MYD、.MYI
压缩表压缩行/列压缩
缓存数据+索引仅索引
典型场景OLTP、金融系统数据仓库、日志系统

查看存储引擎信息

sql
-- 查看MySQL支持的存储引擎
SHOW ENGINES;

-- 查看当前默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';
SELECT @@default_storage_engine;

-- 查看表当前引擎
SHOW TABLE STATUS LIKE 'table_name';

-- 转换引擎(重建表)
ALTER TABLE myisam_table ENGINE = InnoDB;

设置存储引擎

设置服务器默认存储引擎

修改MySQL配置文件my.cnf/my.ini:

ini
[mysqld]
default-storage-engine=InnoDB

重启MySQL服务生效。

会话级别临时修改

sql
SET default_storage_engine=InnoDB;

创建表时指定引擎

sql
CREATE TABLE 表名 (
    列定义...
) ENGINE=InnoDB;

修改已有表的存储引擎

sql
ALTER TABLE 表名 ENGINE=InnoDB;

存储引擎配置参数

InnoDB关键配置

ini
# InnoDB缓冲池大小(建议物理内存的50-70%)
innodb_buffer_pool_size = 4G

# 日志文件大小(建议512MB-2GB)
innodb_log_file_size = 1G

# 日志缓冲区大小
innodb_log_buffer_size = 16M

# 刷新方法(建议O_DIRECT)
innodb_flush_method = O_DIRECT

# 并发线程数
innodb_thread_concurrency = 0

MyISAM关键配置

ini
# 索引缓冲区大小
key_buffer_size = 256M

# 并发插入设置
concurrent_insert = 2

# 修复表选项
myisam-recover-options = BACKUP,FORCE