14.9 InnoDB Disk IO and File Space Management InnoDB Disk 和文件空间管理
14.9.1 InnoDB Disk I/O
14.9.2 File Space Management
14.9.3 InnoDB Checkpoints
14.9.4 Defragmenting a Table
14.9.5 Reclaiming Disk Space with TRUNCATE TABLE
作为一个DBA, 你必须管理disk I/O来保持 I/O 子系统变的饱和,管理磁盘空间来避免填满存储设备。
ACID 涉及模型需要某种大量的I/O 着可能是多余的, 但是帮助你确认数据的可靠性。
有了这些限制,InnoDB 尝试优化数据库工作,和重新组织磁盘文件来最小化磁盘I/O。
有时候,I/O是延迟的 直到数据库是不繁忙的,或者直到一切都需要被待会到一致性的状态,
比如在数据库重启在一个快速关闭后。
这个章节讨论主要的考虑用于I/O 和disk space 对于默认的MySQL 表(也被称为InnoDB表)
1. 控制 后台I/O的总量用于改善查询性能
2.启用或者禁用特性 提供额外的耐用性 昂贵的额外的I/O
3.组织表到很多的小文件,一些大的文件,或者是两个的结合
4. 平衡redo log的大小,当log file 变满的时候
5. 如何重新组织一个表用于优化查询性能
14.9.1 InnoDB Disk I/O
InnoDB 使用异步 disk I/O可能的话,通过创建大量的threads 来处理I/O请求,
当执行其他的数据库操作来处理当I/O 仍旧在处理。
在Linux 和Windows 平台,InnoDB 使用可用的OS和library functions 来执行"本地的" 异步I/O。
在其他平台,InnoDB仍旧使用 I/O threads,但是 threads 可能实际上等待I/O请求来完成,这个技术类似于异步I/O。
预读:
如果InnoDB 可以 决定有一个高概率的,数据马上需要, 它执行预读操作来把数据放入buffer pool
这样就可以在内存中。 一些少的大的读取请求对于临近的数据可以变的更加高效相比几个小的,扩散的请求。
1.在顺序预读,如果 InnoDB发现 访问一个段的部分在表空间是顺序的,
它提前请求批量的读取数据库页到I/O系统。
在随机预读, 如果InnoDB 注意 在表空间的一些区域看起来处理完整的读进到buffer pool,
它请求剩余的读到I/O系统。
Doublewrite Buffer
InnoDB 使用一个新奇的文件flush技术涉及的结构称为 doublewrite buffer,
默认是启用的((innodb_doublewrite=ON). 它增加安全性来恢复 crash或者断电后的恢复,
改善性能在绝大多数Unix 通过降低 fsync() operations.的需要。
在写pages到数据文件时,InnoDB 首先把它们写到一个邻近的表空间区域 称为doublewrite buffer.
只有当写和flush 到doublewrite buffer 已经完成 InnoDB会写pages到它们的适当的位置在数据文件里。
如果有 一个操作系统,存储子系统,或者mysqld处理crash 在page写的期间(造成破损的状况)
InnoDB 可以稍后找到一个好的page的副本从doublewrite buffer在recovery期间