面试题答案
一键面试MariaDB源代码中与存储引擎相关的目录组织结构
- 存储引擎目录:
- 在MariaDB源代码中,存储引擎相关代码通常位于
storage
目录下。该目录是存储引擎代码的核心所在。 - 每个存储引擎都有其独立的子目录,例如
innodb
目录存放InnoDB存储引擎的代码,myisam
目录存放MyISAM存储引擎的代码等。这种结构使得不同存储引擎的代码相互隔离,便于维护和扩展。
- 在MariaDB源代码中,存储引擎相关代码通常位于
- 公共接口目录:
include/mysql/plugin
目录包含了存储引擎与数据库核心交互的公共接口定义。这些接口定义了存储引擎需要实现的一系列函数和数据结构,以便与数据库核心进行通信。例如,存储引擎需要实现的ha_create
、ha_open
、ha_close
等函数的声明都在此处。
不同存储引擎与数据库核心部分的交互细节
- 数据读写交互:
- 读操作:
- 当数据库核心收到一个读请求(例如
SELECT
语句)时,它会根据表的存储引擎类型调用相应存储引擎的接口函数。以InnoDB为例,数据库核心调用InnoDB存储引擎的ha_innobase::rnd_next
或ha_innobase::index_read
等函数。 ha_innobase::rnd_next
用于按物理顺序读取下一条记录,而ha_innobase::index_read
用于根据索引读取记录。存储引擎从自身的数据文件(InnoDB有表空间文件等)中检索数据,并返回给数据库核心。
- 当数据库核心收到一个读请求(例如
- 写操作:
- 对于写操作(如
INSERT
、UPDATE
、DELETE
),数据库核心同样调用存储引擎的相关接口。例如,对于INSERT
操作,调用ha_innobase::write_row
函数。 - 存储引擎会将新数据写入其数据文件,并更新相关的索引结构。例如InnoDB会将数据写入表空间文件,并更新B - Tree索引。同时,为了保证数据的一致性,存储引擎可能会使用日志机制(如InnoDB的重做日志和回滚日志)。
- 对于写操作(如
- 读操作:
- 事务处理交互:
- 事务开始:
- 当数据库核心开始一个事务(例如执行
START TRANSACTION
语句)时,它会通知存储引擎开始事务。不同存储引擎有不同的实现方式,InnoDB存储引擎会在内部初始化事务相关的数据结构,如事务ID等。
- 当数据库核心开始一个事务(例如执行
- 事务提交:
- 当数据库核心接收到
COMMIT
语句时,它会调用存储引擎的提交接口。对于InnoDB,ha_innobase::commit
函数会将事务中的所有修改持久化到磁盘。这包括刷新重做日志,确保即使系统崩溃,已提交的事务也不会丢失数据。同时,会清理事务相关的回滚日志。
- 当数据库核心接收到
- 事务回滚:
- 当数据库核心收到
ROLLBACK
语句时,调用存储引擎的回滚接口。InnoDB的ha_innobase::rollback
函数会利用回滚日志撤销事务中所做的所有修改,将数据恢复到事务开始前的状态。
- 当数据库核心收到
- 事务开始: