MySQL 核心存儲引擎 (InnoDB/MyISAM) 大量依賴文件 I/O。為了跨平台 (Linux/Windows/macOS),MySQL 實現了 **統一抽象層** (`os_file_*` 系列函數),下層分別調用:
HANDLE hFile = CreateFile(
filename, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, // 關鍵標誌
NULL
);
OVERLAPPED ov = {0};
ov.Offset = offset_low;
ov.OffsetHigh = offset_high;
ReadFile(hFile, buffer, size, NULL, &ov); // 立即返回
// 線程可做其他事...
GetOverlappedResult(hFile, &ov, &bytes_read, TRUE); // 等待完成
核心價值:發起 I/O 後線程**不阻塞**,可並發處理其他請求。InnoDB 利用此機制實現 **Native AIO** (Linux 用 `libaio`,Windows 用 `Overlapped`),大幅提升高併發下的磁碟利用率。
| 操作 | POSIX | Win32 API | MySQL 封裝函數 |
|---|---|---|---|
| 打開/創建 | open | CreateFile | os_file_create / os_file_open |
| 讀取 | read / pread | ReadFile | os_file_read / os_file_pread |
| 寫入 | write / pwrite | WriteFile | os_file_write / os_file_pwrite |
| 定位 | lseek | SetFilePointerEx | os_file_seek |
| 刷新 | fsync / fdatasync | FlushFileBuffers | os_file_flush |
| 關閉 | close | CloseHandle | os_file_close |
| 截斷 | ftruncate | SetEndOfFile | os_file_set_size |
[SQL Layer] → [InnoDB Buffer Pool] → [AIO Handler Threads]
↓ 提交 IO Request
[OS File Layer] → [Linux: io_submit / Windows: ReadFile/WriteFile + Overlapped]
↓ 完成通知
[AIO Completion Threads] → [Buffer Pool 更新 / 喚醒用戶線程]
MySQL 文件封裝層是 **「跨平台抽象 + 平台特性極致利用」** 的教科書級範例:POSIX 保證可移植,Win32 Overlapped I/O 釋放 Windows 高併發性能。應用架構設計時,同樣應追求「介面統一、實現專用、異步優先、零拷貝」四大原則。