当前位置: 首页 > news >正文

MySQL常见存储引擎

1、概述

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
http://www.gsyq.cn/news/624.html

相关文章:

  • 【URP】UnityHLSL顶点片元语义详解
  • 跨网文件交换系统案例分享:金融、半导体制造、医院统统都有!
  • 尚硅谷后台管理系统
  • 第二届人工智能与自然语言处理国际学术会议(AINLP 2025)
  • 80、颜色求和
  • 纷享销客重磅亮相SCEE2025西南渠道生态峰会
  • 供应商图纸协同怎么做?安全与效率并行的实践方案!
  • 综述-human parsing
  • rust适合写哪些程序 - ukyo-
  • leecode矩阵
  • MX WEEK3
  • GeoServer 远程代码执行漏洞 CVE-2024-36401
  • Dev C++ 如何手动开大栈空间
  • qoj4808 Great Party
  • PHP 性能优化深度指南:那些被忽视的高效策略
  • 解密平台产品管理的核心技术思维
  • ECT-OS-JiuHuaShan在DeepSeek上的提示语
  • 强力漱囗液~西吡氯铵含漱液
  • github仓库推送拉取设置token
  • 你的部署流程已然落伍-热重启的失传艺术
  • 一次“连镜像都被 RST”的 GitHub push 填坑笔记
  • 分布式事务seata
  • 内容
  • 你的项目一团糟-不是你的错-是框架的锅
  • 【神器 Collection】mermaid:编程语言自动生成流程图
  • 《Python 操作 PDF 文件的常见方法-PDF转Word(附在线工具推荐)》
  • freeRTOS的信号量,是不是有点像中断
  • weston 桌面使用及工作架构
  • 滑动窗口
  • helm 部署 prometheus