您的位置:首页 > 教育 > 培训 > 公司企业做网站_深圳网站建设网络公司_百度云网盘资源搜索引擎入口_网站推广和seo

公司企业做网站_深圳网站建设网络公司_百度云网盘资源搜索引擎入口_网站推广和seo

2025/4/22 13:58:50 来源:https://blog.csdn.net/2401_83830408/article/details/147354176  浏览:    关键词:公司企业做网站_深圳网站建设网络公司_百度云网盘资源搜索引擎入口_网站推广和seo
公司企业做网站_深圳网站建设网络公司_百度云网盘资源搜索引擎入口_网站推广和seo

目录

      • 什么是存储引擎?
      • 常见存储引擎详解
      • 其他存储引擎 (简述)
      • 存储引擎相关语法
      • 总结对比:InnoDB vs MyISAM
      • 练习题 (Practice Exercises - Storage Engines with Answers)

核心目标: 理解 MySQL 存储引擎的概念、作用,了解常见的存储引擎(特别是 InnoDB 和 MyISAM)的特性和区别,并知道如何选择和管理它们。

什么是存储引擎?

存储引擎是 MySQL 数据库管理系统 (DBMS) 的一个核心组件,负责处理表数据的存储、检索以及索引管理等底层操作。MySQL 采用插件式存储引擎架构,允许用户根据应用需求为不同的表选择不同的存储引擎。可以将其视为 MySQL 与物理文件系统交互的接口。

为什么有多种存储引擎?
不同的存储引擎提供了不同的特性、性能、锁定机制和存储方式,以满足各种不同的应用场景。没有一种引擎是万能的,选择合适的引擎对数据库性能和功能至关重要。

关键特性对比维度
在比较存储引擎时,通常关注以下特性:

  • 事务支持 (Transaction Support): 是否支持 ACID 事务(原子性、一致性、隔离性、持久性)。
  • 锁定粒度 (Locking Granularity): 数据操作时锁定的范围(表级锁定、行级锁定)。行级锁定通常支持更高的并发写入。
  • 外键约束 (Foreign Key Support): 是否支持外键来强制参照完整性。
  • 全文索引 (Full-Text Indexing): 是否支持对文本内容进行高效的全文搜索。
  • 崩溃恢复 (Crash Recovery): 数据库异常关闭(如断电)后,引擎恢复数据一致性的能力。
  • 空间使用 (Space Usage): 数据存储占用的磁盘空间大小。
  • 读写性能 (Read/Write Performance): 在不同场景下的读写速度。

常见存储引擎详解

  • InnoDB
    当前 MySQL 的默认存储引擎 (自 MySQL 5.5 起)。
    设计目标是处理大量短期(short-lived)事务,这些事务通常需要高度的可靠性和并发性。
    主要特性:

    • ACID 事务支持: 完全支持事务,提供 COMMIT, ROLLBACK, SAVEPOINT
    • 行级锁定 (Row-Level Locking): 更新或删除操作通常只锁定涉及的行,大大提高了并发写入性能,减少了写操作冲突。
    • 外键约束支持: 支持外键,强制数据参照完整性。
    • 崩溃恢复能力强: 使用事务日志(redo log, undo log)来保证在崩溃后能自动恢复数据一致性。
    • MVCC (Multi-Versioning Concurrency Control): 支持多版本并发控制,允许读写操作在不(或较少)加锁的情况下并发执行,提高了读取性能,是实现可重复读隔离级别的基础。
    • 聚集索引 (Clustered Index): 表数据按主键顺序物理存储。
    • 支持全文索引 (自 MySQL 5.6 起,不断增强)。
      适用场景:
    • 需要事务处理的应用(如银行、电商系统)。
    • 高并发写入的应用。
    • 需要外键保证数据完整性的场景。
    • 对数据安全性和崩溃恢复要求高的应用。
    • 绝大多数现代应用的首选。
  • MyISAM
    MySQL 早期的默认存储引擎。
    设计相对简单,专注于速度,尤其是在读取方面。
    主要特性:

    • 无事务支持: 不支持 ACID 事务。操作是原子的(单条语句),但不能组合成事务。
    • 表级锁定 (Table-Level Locking): 对表进行写操作(INSERT, UPDATE, DELETE)时会锁定整个表,读操作锁定表(共享读锁)。这在高并发写场景下性能较差。
    • 无外键约束支持: 不支持外键。
    • 崩溃恢复能力较弱: 如果系统崩溃,可能导致数据文件损坏,需要手动修复(REPAIR TABLE),不保证数据完全恢复。
    • 读取性能通常较快: 特别是全表扫描或大量读取时,因为其结构更简单,索引和数据分开存储。
    • 优秀的全文索引支持: 历史上 MyISAM 的全文索引性能和功能优于早期 InnoDB,但差距已缩小。
    • 存储空间相对较小: 通常比 InnoDB 占用更少的磁盘空间(无事务日志等开销)。
    • 支持表压缩: 可以使用 myisampack 压缩表以节省空间(压缩后通常为只读)。
      适用场景:
    • 只读或读密集型应用(如数据仓库、日志记录表)。
    • 不需要事务支持的场景。
    • 可以容忍较低并发写入和较弱崩溃恢复能力的系统。
    • 对全文搜索有特殊要求且不需事务的旧系统。
    • 目前使用场景已大大减少,通常被 InnoDB 替代。

其他存储引擎 (简述)

  • MEMORY (或 HEAP):

    • 所有数据存储在内存中,速度极快。
    • 数据库重启后数据全部丢失。
    • 表级锁定。
    • 适用于临时表、缓存、会话管理等。
  • CSV:

    • 将表数据存储在标准的逗号分隔值(CSV)文件中。
    • 不支持索引。
    • 方便与其他程序进行数据交换。
  • ARCHIVE:

    • 用于存储大量历史归档数据。
    • 高压缩率,占用空间小。
    • 只支持 INSERTSELECT,不支持 UPDATE, DELETE, 索引(除了自增 ID)。
    • 插入性能好。
  • NDB (或 NDBCLUSTER):

    • MySQL Cluster 集群使用的存储引擎,提供高可用性和实时性能。

存储引擎相关语法

  • 查看支持的存储引擎及状态:
SHOW ENGINES;

输出会包含引擎名称、是否支持、是否默认、是否支持事务等信息。

  • 查看默认存储引擎:
SHOW VARIABLES LIKE 'default_storage_engine';
  • 创建表时指定存储引擎:
    CREATE TABLE 语句末尾使用 ENGINE = engine_name 子句。
-- 创建一个使用 InnoDB 的表
CREATE TABLE users_innodb (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE = InnoDB;-- 创建一个使用 MyISAM 的表
CREATE TABLE logs_myisam (
log_id INT AUTO_INCREMENT PRIMARY KEY,
message TEXT
) ENGINE = MyISAM;-- 如果不指定 ENGINE 子句,将使用默认存储引擎
CREATE TABLE default_engine_table (
data VARCHAR(100)
);
  • 修改现有表的存储引擎:
    使用 ALTER TABLE 语句。
ALTER TABLE my_table ENGINE = new_engine_name;

注意: 修改存储引擎可能是一个耗时且消耗资源的操作,尤其是对大表。MySQL 可能需要复制整个表的数据。在转换过程中,表可能会被锁定。此外,从支持事务/外键的引擎转到不支持的引擎(如 InnoDB -> MyISAM)会导致这些特性丢失。

示例:

-- 将名为 old_logs 的 MyISAM 表转换为 InnoDB
ALTER TABLE old_logs ENGINE = InnoDB;
  • 查看表的存储引擎:
SHOW CREATE TABLE table_name;

输出的 CREATE TABLE 语句末尾会包含 ENGINE=... 部分。
或者查询 information_schema 数据库:

SELECT ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';

如何选择存储引擎?

基于应用需求进行选择:

  1. 事务与数据完整性: 如果需要 ACID 事务、外键约束、行级锁定以支持高并发写入、崩溃恢复能力,选择 InnoDB。这是绝大多数现代应用的选择。
  2. 读取性能与简单性: 如果应用主要是读取操作,不需要事务,可以接受表级锁定带来的并发写入限制,并且对崩溃恢复要求不高,可以考虑 MyISAM,但现在也通常推荐 InnoDB,因为 InnoDB 的读取性能也很好,且提供了更多保障。
  3. 临时高速缓存: 需要极快的访问速度,数据丢失可接受,选择 MEMORY
  4. 数据交换: 需要方便地导入导出纯文本数据,选择 CSV
  5. 归档大量数据: 需要高压缩率存储历史数据,且主要是追加写入,选择 ARCHIVE
  6. MySQL 集群: 选择 NDB

总结对比:InnoDB vs MyISAM

特性InnoDBMyISAM
默认引擎是 (MySQL 5.5+)否 (曾是)
事务 (ACID)支持不支持
锁定粒度行级锁定 (通常)表级锁定
外键支持不支持
崩溃恢复强 (事务日志)弱 (可能需手动修复)
MVCC支持不支持
全文索引支持 (不断改进)支持 (曾是优势)
空间使用相对较大 (事务日志等开销)相对较小
并发写入性能
读取性能很好 (尤其主键查找)很好 (尤其全表扫描)
聚集索引 (按主键物理存储)否 (索引与数据分离)
推荐场景绝大多数应用,尤其需要事务和并发读密集、非事务性、特定旧系统场景

练习题 (Practice Exercises - Storage Engines with Answers)

  1. 执行命令查看你的 MySQL 服务器支持哪些存储引擎,以及哪个是默认引擎。
    答案:

    SHOW ENGINES;
    SHOW VARIABLES LIKE 'default_storage_engine';
    
  2. 创建一个名为 test_innodb 的表,包含 id (INT PRIMARY KEY) 和 data (TEXT) 列,并明确指定使用 InnoDB 存储引擎。
    答案:

    CREATE TABLE test_innodb (
    id INT PRIMARY KEY,
    data TEXT
    ) ENGINE = InnoDB;
    
  3. 创建一个名为 test_myisam 的表,结构同上,但明确指定使用 MyISAM 存储引擎。
    答案:

    CREATE TABLE test_myisam (
    id INT PRIMARY KEY,
    data TEXT
    ) ENGINE = MyISAM;
    
  4. 查看 test_innodb 表的创建语句,确认其存储引擎。
    答案:

    SHOW CREATE TABLE test_innodb;
    
  5. test_myisam 表的存储引擎修改为 InnoDB。
    答案:

    ALTER TABLE test_myisam ENGINE = InnoDB;
    
  6. 再次查看 test_myisam 表的创建语句,确认存储引擎是否已更改。
    答案:

    SHOW CREATE TABLE test_myisam;
    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com