MySQL 的存储引擎是数据库的底层核心组件,它决定了数据如何存储、索引如何组织、事务是否支持以及并发控制机制等关键特性。选择合适的存储引擎对数据库的性能、可靠性和功能实现至关重要。

查看支持的存储引擎

SHOW ENGINES;

设置默认存储引擎

在 MySQL 配置文件 my.cnf 中设置

[mysqld]

default-storage-engine=InnoDB

2、 InnoDB(MySQL 5.5+ 默认引擎)

InnoDB 是 MySQL 最常用的存储引擎,专为事务处理和高并发场景设计,支持 ACID 事务和行级锁。

核心特性:

支持事务:完全符合 ACID 特性,支持 COMMIT、ROLLBACK、SAVEPOINT。

行级锁:仅锁定修改的行,大幅提升并发写性能(适合多用户同时操作)。

外键约束:支持 FOREIGN KEY,保证数据参照完整性。

聚簇索引:数据和主键索引存储在一起,查询主键效率极高。

崩溃恢复:通过 redo log 和 undo log 实现崩溃后的数据恢复。

MVCC:多版本并发控制,支持高并发读写(读不加锁,读写不冲突)。

示例

-- 创建 InnoDB 表

CREATE TABLE users (

id INT AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(100) NOT NULL,

email VARCHAR(100) UNIQUE,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

) ENGINE=InnoDB;

-- 创建带外键的 InnoDB 表

CREATE TABLE orders (

id INT AUTO_INCREMENT PRIMARY KEY,

user_id INT NOT NULL,

amount DECIMAL(10,2),

order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE

) ENGINE=InnoDB;

3、MyISAM(早期 MySQL 默认引擎)

MyISAM 是 MySQL 最早的存储引擎,不支持事务和行锁,但查询性能较好,适合读多写少的场景。

核心特性:

不支持事务:无 COMMIT/ROLLBACK,崩溃后可能数据损坏。

表级锁:修改数据时锁定整个表,并发写性能差。

不支持外键:不支持外键约束

支持全文索引:早期版本中唯一支持全文索引的引擎(MySQL 5.6 后 InnoDB 也支持)。

存储结构:数据和索引分开存储(.MYD 数据文件,.MYI 索引文件)。

压缩表:可压缩只读表,节省存储空间。

示例

-- 创建 MyISAM 表

CREATE TABLE logs (

id INT AUTO_INCREMENT PRIMARY KEY,

message TEXT,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

FULLTEXT(message)

) ENGINE=MyISAM;

-- 使用全文搜索

SELECT * FROM logs WHERE MATCH(message) AGAINST('error');

3、Memory(Heap)

Memory 引擎将数据完全存储在内存中,访问速度极快,但数据在重启后丢失,适合临时数据存储。

核心特性:

内存存储:数据存于内存,读写速度远快于磁盘引擎。

支持哈希索引:默认使用哈希索引,等值查询效率极高(范围查询性能差)。

表级锁:并发写性能有限。

数据易失:MySQL 重启或崩溃后,数据全部丢失。

存储限制:受内存大小限制,不适合存储大量数据。

示例

-- 创建 Memory 表

CREATE TABLE session_data (

session_id VARCHAR(32) PRIMARY KEY,

user_id INT,

data TEXT,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

) ENGINE=MEMORY;

-- 插入数据

INSERT INTO session_data (session_id, user_id, data)

VALUES ('abc123', 1, 'user_preferences');

4、存储引擎常见操作

4.1 查看表的存储引擎

SHOW TABLE STATUS LIKE 'table_name';

-- 或

SELECT TABLE_NAME, ENGINE

FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA = 'your_database';

4.2 修改表的存储引擎

ALTER TABLE table_name ENGINE = InnoDB;

4.3 性能优化建议

4.3.1 InnoDB 优化

-- 调整缓冲池大小(在my.cnf中设置)

[mysqld]

innodb_buffer_pool_size = 1G

-- 使用合适的行格式

ALTER TABLE table_name ROW_FORMAT=COMPRESSED;

-- 调整日志文件大小

innodb_log_file_size = 256M

4.3.2 MyISAM 优化

-- 优化表(整理碎片)

OPTIMIZE TABLE table_name;

-- 调整键缓存大小(在my.cnf中设置)

key_buffer_size = 256M

Logo

更多推荐