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

七十四、【Linux数据库】MySQL数据库存储引擎

MySQL 存储引擎功能概述

核心功能
  1. 数据存储格式:定义数据在磁盘上的物理存储方式
  2. 事务支持:ACID 特性保证数据一致性
  3. 锁机制:控制并发访问的锁策略
  4. 索引结构:实现高效数据检索
  5. 崩溃恢复:故障后自动恢复数据一致性
引擎对比
特性InnoDBMyISAMMemoryArchive
事务支持
行级锁
外键约束
崩溃恢复
全文索引✓ (5.6+)
存储限制64TB256TBRAM大小无限制
适用场景OLTP只读分析临时缓存日志归档

一、存储引擎操作演示

1. 查看存储引擎
# 登录MySQL
[root@localhost ~]# mysql -u root -p
Enter password: ******# 查看支持的引擎
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+# 查看当前默认引擎
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+
2. 创建表指定引擎
# 创建InnoDB表
mysql> CREATE TABLE innodb_tbl (id INT PRIMARY KEY,data VARCHAR(100)
) ENGINE=InnoDB;# 创建MyISAM表
mysql> CREATE TABLE myisam_tbl (id INT PRIMARY KEY,data VARCHAR(100)
) ENGINE=MyISAM;# 创建Memory表
mysql> CREATE TABLE memory_tbl (id INT PRIMARY KEY,data VARCHAR(100)
) ENGINE=MEMORY;
3. 修改表引擎
# 修改为InnoDB
mysql> ALTER TABLE myisam_tbl ENGINE=InnoDB;# 修改为MyISAM
mysql> ALTER TABLE innodb_tbl ENGINE=MyISAM;
4. 查看表引擎信息
mysql> SHOW TABLE STATUS LIKE 'innodb_tbl'\G
*************************** 1. row ***************************Name: innodb_tblEngine: InnoDBVersion: 10Row_format: DynamicRows: 0Avg_row_length: 0Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2023-06-15 14:30:05Update_time: NULLCheck_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options: Comment: 

二、引擎特性演示

1. InnoDB 事务演示
# 开启事务
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_tbl VALUES (1, 'Transaction test');# 回滚事务
mysql> ROLLBACK;# 验证数据未提交
mysql> SELECT * FROM innodb_tbl;
Empty set (0.00 sec)
2. MyISAM 表修复
# 模拟表损坏
[root@localhost ~]# dd if=/dev/zero of=/var/lib/mysql/test/myisam_tbl.MYD bs=1 count=100# 检查表状态
mysql> CHECK TABLE myisam_tbl;
+-------------------+-------+----------+----------------------------------------------------+
| Table             | Op    | Msg_type | Msg_text                                           |
+-------------------+-------+----------+----------------------------------------------------+
| test.myisam_tbl   | check | Error    | Corrupt                                            |
+-------------------+-------+----------+----------------------------------------------------+# 修复表
mysql> REPAIR TABLE myisam_tbl;
+-------------------+--------+----------+----------------------------------------------------+
| Table             | Op     | Msg_type | Msg_text                                           |
+-------------------+--------+----------+----------------------------------------------------+
| test.myisam_tbl   | repair | status   | OK                                                 |
+-------------------+--------+----------+----------------------------------------------------+
3. Memory 引擎特性
# 插入数据
mysql> INSERT INTO memory_tbl VALUES (1, 'Memory data');# 重启MySQL服务
[root@localhost ~]# systemctl restart mysqld# 验证数据丢失
mysql> SELECT * FROM memory_tbl;
Empty set (0.00 sec)
4. Archive 引擎压缩
# 创建Archive表
mysql> CREATE TABLE archive_tbl (id INT,log TEXT
) ENGINE=ARCHIVE;# 插入数据
mysql> INSERT INTO archive_tbl VALUES (1, REPEAT('Log entry ', 1000));# 查看文件大小
[root@localhost ~]# ls -lh /var/lib/mysql/test/archive_tbl.ARZ
-rw-r----- 1 mysql mysql 2.5K Jun 15 15:00 archive_tbl.ARZ

三、性能对比测试

1. 插入性能测试
# 创建测试表
mysql> CREATE TABLE insert_test_innodb (id INT) ENGINE=InnoDB;
mysql> CREATE TABLE insert_test_myisam (id INT) ENGINE=MyISAM;# 批量插入测试
mysql> SET profiling=1;
mysql> INSERT INTO insert_test_innodb SELECT * FROM seq_1_to_1000000;
mysql> INSERT INTO insert_test_myisam SELECT * FROM seq_1_to_1000000;
mysql> SHOW PROFILES;
+----------+------------+----------------------------------------------------+
| Query_ID | Duration   | Query                                              |
+----------+------------+----------------------------------------------------+
|        1 | 5.23148200 | INSERT INTO insert_test_innodb SELECT ...          |
|        2 | 3.87654100 | INSERT INTO insert_test_myisam SELECT ...          |
+----------+------------+----------------------------------------------------+
2. 查询性能测试
# 创建索引
mysql> ALTER TABLE insert_test_innodb ADD INDEX idx_id(id);
mysql> ALTER TABLE insert_test_myisam ADD INDEX idx_id(id);# 范围查询测试
mysql> SELECT COUNT(*) FROM insert_test_innodb WHERE id BETWEEN 1000 AND 2000;
1 row in set (0.15 sec)mysql> SELECT COUNT(*) FROM insert_test_myisam WHERE id BETWEEN 1000 AND 2000;
1 row in set (0.08 sec)

命令总结表格

演示命令功能描述关键参数
SHOW ENGINES查看支持引擎
SELECT @@default_storage_engine查看默认引擎
CREATE TABLE t (...) ENGINE=InnoDB指定引擎创建表ENGINE=
ALTER TABLE t ENGINE=InnoDB修改表引擎ENGINE=
SHOW TABLE STATUS LIKE 't'查看表引擎信息表名
START TRANSACTION开始事务
ROLLBACK回滚事务
REPAIR TABLE t修复MyISAM表表名
SET profiling=1启用性能分析
SHOW PROFILES查看查询性能

功能作用详解

1. InnoDB 深度解析

核心特性

InnoDB
事务ACID
行级锁
外键约束
MVCC
缓冲池

关键配置

# my.cnf 配置
innodb_buffer_pool_size=物理内存的70-80%
innodb_log_file_size=缓冲池的25%
innodb_flush_log_at_trx_commit=1  # 完全持久化
2. MyISAM 适用场景

优势场景

  1. 全文本搜索MATCH AGAINST 操作
  2. 数据仓库:只读或读密集型操作
  3. 空间数据:GIS 空间索引支持

维护命令

# 优化表(碎片整理)
OPTIMIZE TABLE myisam_tbl;# 修复索引
REPAIR TABLE myisam_tbl QUICK;
3. Memory 引擎限制

使用注意事项

  1. 数据丢失:服务重启后数据清空
  2. 表大小限制max_heap_table_size 控制
  3. 不支持BLOB/TEXT:只支持定长数据类型

临时表优化

-- 显式创建临时表
CREATE TEMPORARY TABLE temp_data ENGINE=MEMORY SELECT * FROM large_table;
4. 其他引擎应用

CSV 引擎

-- 创建CSV表
CREATE TABLE csv_data (id INT,name VARCHAR(50)
) ENGINE=CSV;-- 外部数据导入
LOAD DATA INFILE '/data/import.csv' INTO TABLE csv_data;

Archive 引擎

-- 高压缩比存储
INSERT INTO archive_logs SELECT * FROM access_log;-- 只支持插入查询
SELECT * FROM archive_logs WHERE id=100;  -- 全表扫描
5. 生产环境选型

OLTP 系统

Web应用
InnoDB
支付系统
订单系统

分析系统

数据仓库
MyISAM
报表系统
日志分析
Archive
6. 性能优化指南

InnoDB 优化

# 缓冲池优化
innodb_buffer_pool_instances=8  # 多实例减少锁争用
innodb_flush_method=O_DIRECT    # 直接IO减少双缓冲# IO优化
innodb_io_capacity=2000         # SSD配置
innodb_read_io_threads=8
innodb_write_io_threads=8

MyISAM 优化

# 键缓存
key_buffer_size=512M# 并发插入
concurrent_insert=2
http://www.dtcms.com/a/341775.html

相关文章:

  • 11让LLM更懂FunctionCalling返回值
  • S32K3 的图形化配置和EB配置mcal差异
  • week2-[二维数组]排队
  • MySQL/Kafka数据集成同步,增量同步及全量同步
  • Windows 如何清理右键菜单?电脑桌面右键菜单里出现一个清理内存 怎么去掉?
  • 数据结构中邻接矩阵中的无向图和有向图
  • 流固耦合|01流固耦合分类
  • 面试 TOP101 二分查找/排序专题题解汇总Java版(BM17 —— BM22)
  • Alpha测试:软件上线前的关键环节
  • 意象框架:连接感知与认知的统一信息结构分析——基于上古汉语同源词意义系统的词源学与认知语言学探索
  • 深入理解与应用向量嵌入(Vector Embeddings):原理、实现与多场景实践
  • 轻量级流程编排框架,Solon Flow v3.5.0 发布
  • WEB安全篇:浏览器攻击原理及防护
  • 软件设计师——数据结构与算法基础学习笔记
  • mac安装Trae并解决App Unavailable问题
  • 【Java进阶】Java JIT 编译器深度解析与优化实践
  • 49.Seata-XA模式
  • Day57 Java面向对象12 多态
  • 齐次线性方程组最小二乘解
  • 压缩包密码找回工具递归解压增强版使用说明
  • 机器学习数据预处理学习报告
  • Linux用30秒部署Nginx+Tomcat+Mysql+Jdk1.8环境
  • Paging in Operating System
  • windows server 彻底卸载oracle 11g
  • Linux命令大全-ps命令
  • AdaCoT:基于强化学习的帕累托最优自适应思维链触发机制
  • 自动泊车辅助系统的漏洞、威胁与风险分析
  • MDP(马尔可夫决策过程)与 RL(强化学习)
  • 半导体开关器件深度解析:PNP、NPN、PMOS、NMOS
  • 使用PCL读取PCD点云文件