面试题答案
一键面试InnoDB存储引擎
- 数据结构
- 聚簇索引:InnoDB将数据和索引存储在一起,表数据文件本身就是按B+树组织的一个索引结构,叶节点包含完整的数据行。这种结构使得按主键查询效率极高。
- 辅助索引:也是B+树结构,叶节点存储的是主键值,通过辅助索引查询到主键后,再通过主键索引获取完整数据,即所谓的回表操作。
- 表空间:包含多个段(Segment),段由区(Extent)组成,区又由页(Page)构成。常见的表空间有系统表空间、用户表空间等。
- 接口定义
- 存储引擎接口:提供诸如
ha_open
用于打开表,ha_close
用于关闭表,ha_read_row
用于读取数据行等接口函数。这些接口与上层数据库核心模块交互,使得数据库核心能以统一方式操作不同存储引擎。 - 事务接口:支持事务相关操作,如
trx_start
开始事务,trx_commit
提交事务,trx_rollback
回滚事务。通过这些接口保证事务的ACID特性。
- 存储引擎接口:提供诸如
- 与其他模块交互方式
- 与缓冲池模块:缓冲池用于缓存数据页和索引页,InnoDB通过缓冲池接口将经常访问的数据页加载到内存中,以提高读写性能。当数据页发生修改时,会将其标记为脏页,后续由缓冲池的刷新机制将脏页写回磁盘。
- 与日志模块:InnoDB使用重做日志(redo log)来保证崩溃恢复(crash - recovery)能力。在进行数据修改前,会先将修改操作记录到重做日志中。同时,通过回滚日志(undo log)实现事务的回滚以及MVCC(多版本并发控制)。
MyISAM存储引擎
- 数据结构
- 索引结构:MyISAM使用非聚簇索引,数据文件和索引文件是分离的。索引文件也是B+树结构,叶节点存储的是数据的物理地址。
- 表结构:表由.frm文件存储表结构定义,.MYD文件存储数据,.MYI文件存储索引。
- 接口定义
- 同样提供类似
ha_open
、ha_close
、ha_read_row
等标准存储引擎接口与上层数据库核心交互。但MyISAM不支持事务,所以没有事务相关接口。
- 同样提供类似
- 与其他模块交互方式
- 与缓存模块:MyISAM自身有键缓存(key buffer),用于缓存索引块,提高索引访问性能。与InnoDB不同,MyISAM不缓存数据,只缓存索引。
- 与锁模块:MyISAM使用表级锁,在执行写操作(如
INSERT
、UPDATE
、DELETE
)时,会锁定整个表,以保证数据一致性。读操作(如SELECT
)时也会对表加读锁,防止写操作干扰。