57 能否为一张表单独设置存储引擎?
CREATE TABLE 表名 (
列定义...
) ENGINE = 引擎名;
58 如何开发自己的 MySQL 存储引擎?
基础前提
- 对MySQL源码非常熟悉(尤其是 Server 层)
- 掌握存储引擎插件接口(Storage Engine API)
- 具备强大的 C/C++ 工程能力
- 理解数据库核心机制:事务、MVCC、锁、索引、日志、缓存、恢复等
- 了解现有引擎设计(如 InnoDB、MyISAM)
🚀 二、开发步骤(从入门到架构)
| 阶段 | 内容 | 工具与资源 |
|---|---|---|
| 1 | 阅读 MySQL 源码(Server 层 + handler 层) | GitHub 源码、Percona、MariaDB 分支更活跃 |
| 2 | 实现一个最小化引擎(参考 Example Engine) | 官方源码提供的 example 模板 |
| 3 | 实现基本能力:建表/增删改查 | handler.cc、handler.h、ha_xxx.cc |
| 4 | 支持事务(Redo、Undo、锁) | 需设计日志机制、内存表结构、锁管理 |
| 5 | 支持索引(B+树 / LSM Tree) | 参考 InnoDB / MyRocks 索引模块 |
| 6 | 支持并发与一致性(MVCC) | 支持不同隔离级别,构建版本控制 |
| 7 | 支持崩溃恢复(WAL、Doublewrite) | 自研日志系统或复用已有模块 |
| 8 | 调优:缓存、压缩、写放大、持久化性能 | 根据业务场景优化 |
| 9 | 集成测试、benchmark | 使用 sysbench、TPC-C、自研数据模拟器 |
59 InnoDB 和 MyISAM 的区别是什么?
I 聚簇索引:数据与主键索引存储在一起, M 非聚簇索引:数据与索引分开
- InnoDB:适合事务型、高并发、更新频繁的业务系统(如订单系统、支付系统)
- MyISAM:适合读多写少、对事务要求不高的场景(如日志分析、报表系统)
| InnoDB | MyISAM | |
|---|---|---|
| 事务支持 | 支持事务(ACID)、支持回滚、提交、崩溃恢复 | 不支持事务 |
| 锁机制 | 行级锁(并发更优) | 表级锁(并发较差) |
| 外键支持 | 支持 | 不支持 |
| 崩溃恢复 | 支持崩溃恢复、具备 redo/undo日志 | 不支持,需要手动恢复 |
| MVCC支持 | 支持(提高读写并发) | 不支持 |
| 存储结构 | 聚簇索引:数据与主键索引存储在一起 | 非聚簇索引:数据与索引分开 |
| 表空间 | 支持独立表空间、共享表空间 | 每个表一个.MYD数据文件+.MYI索引文件 |
60 具体说一下如何做技术选型
- 除非几乎没有写操作全部都是高频的读操作 可以选择 MyISAM 作为表的存储引擎。
- 其他业务可以一律使用 InnoDB。