数据库通常借助日志来实现事务,常见的有undo log、redo log
undo/redo log都能保证事务特性,undo log实现事务原子性,redolog实现事务的持久性。
为了最大程度避免数据写入时io瓶颈带来的性能问题,MySQL采用了这样一种缓存机制:
- 当query修改数据库内数据时,InnoDB先将该数据从磁盘读取到内存中,修改内存中的数据拷贝,并将该修改行为持久化到磁盘上的事务日志(先写redo log buffer,再定期批量写入),而不是每次都直接将修改过的数据记录到硬盘内,等事务日志持久化完成之后,内存中的脏数据可以慢慢刷回磁盘,称之为
Write-Ahead Logging
。 - 事务日志采用的是追加写入,顺序io会带来更好的性能优势。
- 为了避免脏数据刷回磁盘过程中,掉电或系统故障带来的数据丢失问题,InnoDB采用事务日志(redo log)来解决该问题。
先简单了解几个概念
数据库数据存放的文件称为data file
;
日志文件称为log file;
数据库数据是有缓存的,如果没有缓存,每次都写或者读物理disk,那性能就太低下了。数据库数据的缓存称为data buffer,日志(redo)缓存称为log buffer。
内存缓冲池
buffer pool如果mysql不用内存缓冲池,每次读写数据时,都需要访问磁盘,必定会大大增加I/O请求,导致效率低下。所以Innodb引擎在读写数据时,把相应的数据和索引载入到内存中的缓冲池(buffer pool)中,一定程度的提高了数据读写的速度。
buffer pool
:
占最大块内存,用来存放各种数据的缓存包括有索引页、数据页、undo页、插入缓冲、自适应哈希索引、innodb存储的锁信息、数据字典信息等。工作方式总是将数据库文件按页(每页16k)读取到缓冲池,然后按最近最少使用(lru)的算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后即为脏页dirty page),然后再按照一定的频率将缓冲池的脏页刷新到文件。
表空间
表空间可看做是InnoDB存储引擎逻辑结构的最高层。
- 表空间文件:InnoDB默认的表空间文件为ibdata1。
- 段:表空间由各个段组成,常见的段有数据段、索引段、回滚段(undo log段)等。
- 区:由64个连续的页组成,每个页大小为16kb,即每个区大小为1MB。
- 页:每页16kb,且不能更改。常见的页类型有:数据页、Undo页、系统页、事务数据页