MySQL 存储引擎

选择合适的存储引擎是优化的第一步

🎯 面试重点

📖 存储引擎对比

InnoDB

/**
 * InnoDB 存储引擎
 * 
 * 特点:
 * - 支持事务(ACID)
 * - 支持行级锁
 * - 支持外键
 * - 支持崩溃恢复
 * - 使用 B+ 树索引
 * - MVCC 实现并发
 * 
 * 适用场景:
 * - 需要事务支持
 * - 高并发读写
 * - 数据完整性要求高
 */
public class InnoDBFeatures {
    // 创建 InnoDB 表
    /*
     * CREATE TABLE orders (
     *     id BIGINT PRIMARY KEY AUTO_INCREMENT,
     *     customer_id BIGINT,
     *     amount DECIMAL(10,2),
     *     created_at TIMESTAMP
     * ) ENGINE=InnoDB;
     */
}

MyISAM

/**
 * MyISAM 存储引擎
 * 
 * 特点:
 * - 不支持事务
 * - 支持表级锁
 * - 不支持外键
 * - 不支持崩溃恢复
 * - 使用 B+ 树索引
 * - 压缩表节省空间
 * - 全文索引支持
 * 
 * 适用场景:
 * - 只读/写少的场景
 * - 全文搜索
 * - 空间函数应用
 */
public class MyISAMFeatures {
    // 创建 MyISAM 表
    /*
     * CREATE TABLE articles (
     *     id INT PRIMARY KEY AUTO_INCREMENT,
     *     title VARCHAR(200),
     *     content TEXT,
     *     FULLTEXT(content)
     * ) ENGINE=MyISAM;
     */
}

对比

/**
 * InnoDB vs MyISAM 对比
 */
public class EngineComparison {
    /*
     * | 特性           | InnoDB                  | MyISAM                   |
     * |----------------|-------------------------|--------------------------|
     * | 事务           | ✅ 支持(ACID)          | ❌ 不支持                 |
     * | 锁级别         | 🔒 行级锁                | 🔒 表级锁                |
     * | 外键           | ✅ 支持                  | ❌ 不支持                 |
     * | 崩溃恢复       | ✅ 支持(redo/undo log) | ❌ 不支持                 |
     * | 全文索引       | ✅ MySQL 5.6+ 支持        | ✅ 支持                   |
     * | 索引结构       | 🏗️ B+ 树(聚簇索引)      | 🏗️ B+ 树(非聚簇索引)     |
     * | 并发性能       | 🚀 高(MVCC)            | 🐌 低                    |
     * | 存储文件       | 📁 .ibd(数据+索引)      | 📁 .MYD(数据)/.MYI(索引)|
     * | 缓存机制       | 📊 缓冲池(Buffer Pool)  | 📊 键缓存(Key Cache)    |
     * | 压缩           | ✅ 支持                  | ✅ 支持                   |
     * | 空间函数       | ❌ 不支持                 | ✅ 支持                   |
     * | 主键           | 🔑 必须有                | 🔑 可以没有              |
     * | 数据行数统计   | 🎯 不精确(采样统计)     | 🎯 精确(计数器)         |
     * | 适用场景       | 💼 业务表、交易系统       | 📊 日志、配置、只读查询    |
     */
}

其他存储引擎

/**
 * 其他存储引擎
 */
public class OtherEngines {
    // Memory (Heap)
    /*
     * 数据存储在内存中
     * 速度快,适合临时表
     * 数据丢失
     */
    
    // Archive
    /*
     * 压缩存储
     * 只支持 INSERT/SELECT
     * 适合日志、审计表
     */
    
    // CSV
    /*
     * CSV 格式存储
     * 适合数据导入导出
     */
    
    // Merge
    /*
     * 分区表的集合
     * 适合历史数据归档
     */
}

📖 详细对比分析

1. 存储结构差异

InnoDB

MyISAM

2. 锁机制对比

InnoDB 行级锁

-- 行锁示例
BEGIN;
SELECT * FROM orders WHERE id = 1 FOR UPDATE; -- 对 id=1 加行锁
-- 其他事务不能修改 id=1 的行,但可以修改其他行
UPDATE orders SET amount = 100 WHERE id = 1;
COMMIT;

MyISAM 表级锁

-- 表锁示例(自动加锁)
UPDATE myisam_table SET col1 = 'value' WHERE id = 1;
-- 整个表被锁定,其他写操作需要等待

3. 事务与崩溃恢复

InnoDB 事务日志

MyISAM 无事务

4. 性能差异

读写性能

并发性能

内存使用

5. 特殊功能

MyISAM 优势

InnoDB 优势

📖 面试真题

Q1: InnoDB 和 MyISAM 的区别?

答:

  1. 事务支持:InnoDB 支持事务(ACID),MyISAM 不支持
  2. 锁级别:InnoDB 行级锁,MyISAM 表级锁
  3. 外键约束:InnoDB 支持,MyISAM 不支持
  4. 崩溃恢复:InnoDB 通过 redo/undo log 恢复,MyISAM 容易损坏
  5. 索引结构:InnoDB 聚簇索引,MyISAM 非聚簇索引
  6. 并发能力:InnoDB MVCC 高并发,MyISAM 读写互斥
  7. 全文索引:MyISAM 原生支持,InnoDB 5.6+ 支持

Q2: 什么场景使用 MyISAM?

答:

Q3: InnoDB 为什么推荐使用自增主键?

答:

Q4: MyISAM 表损坏如何处理?

答:

  1. 使用 CHECK TABLE table_name 检查表状态
  2. 使用 REPAIR TABLE table_name 尝试修复
  3. 使用命令行工具 myisamchk -r table_name
  4. 从备份恢复,或使用 mysqlcheck 工具
  5. 建议定期使用 OPTIMIZE TABLE 整理碎片

Q5: 如何从 MyISAM 迁移到 InnoDB?

答:

  1. 备份数据mysqldump 全量备份
  2. 修改引擎ALTER TABLE table_name ENGINE=InnoDB;
  3. 参数调整:增加 innodb_buffer_pool_size
  4. 测试验证:功能测试和性能测试
  5. 灰度切换:逐步迁移,监控性能

🎯 选择建议

选择 InnoDB 的情况:

选择 MyISAM 的情况:

混合使用策略:

📖 面试真题

Q1: InnoDB 和 MyISAM 的区别?

答: InnoDB 和 MyISAM 是 MySQL 两种主要的存储引擎,主要区别如下:

1. 事务支持

2. 锁机制

3. 外键约束

4. 索引结构

5. 崩溃恢复

6. 存储方式

7. 全文索引

8. 缓存

总结对比表: | 特性 | InnoDB | MyISAM | |——|——–|——–| | 事务 | ✅ 支持 | ❌ 不支持 | | 锁级别 | 行级锁 | 表级锁 | | 外键 | ✅ 支持 | ❌ 不支持 | | 崩溃恢复 | ✅ 有 redo log | ❌ 无 | | 全文索引 | ✅ 5.6+ | ✅ 原生 | | 索引类型 | 聚集索引 | 非聚集索引 | | 缓存 | 数据和索引 | 仅索引 | | 适用场景 | OLTP(高并发写) | OLAP(读多写少) |

选择建议


⭐ 重点:InnoDB 是 MySQL 的默认存储引擎,从 MySQL 5.5 开始全面替代 MyISAM