首先我们先考虑一下,刚才是不是已经给大家讲过,当我们要执行update之类的SQL语句的时候,必然涉及到对数据 的更新操作?那么此时对数据是在哪里更新的?
    此时并不是直接去更新磁盘文件,而是要把磁盘上的一些数据加载到内存里来,然后对内存里的数据进行更新,同时 写redo log到磁盘上去,我们看下图回忆一下。

    image.png
    但是这里就有一个问题了,难道我们每次都是把磁盘里的一条数据加载到内存里去进行更新,然后下次要更新别的数 据的时候,再从磁盘里加载另外一条数据到内存里去? 这样每次都是一条数据一条数据的加载到内存里去更新,大家觉得效率高吗? 很明显是不高的 所以innodb存储引擎在这里引入了一个数据页的概念,也就是把数据组织成一页一页的概念,每一页有16kb,然后每 次加载磁盘的数据到内存里的时候,是至少加载一页数据进去,甚至是多页数据进去,我们看下图
    image.png

    假设我们有一次要更新一条id=1的数据: update xxx set xxx=xxx where id=1 那么此时他会把id=1这条数据所在的一页数据都加载到内存里去,这一页数据里,可能还包含了id=2,id=3等其他数 据。 然后我们更新完id=1的数据之后,接着更新id=2的数据,那么此时是不是就不用再次读取磁盘里的数据了? 因为id=2本身就跟id=1在一页里,之前这一页数据就加载到内存里去了,你直接更新内存里的数据页中的id=2这条数 据就可以了。 我们看下图,这就是数据页的意义,磁盘和内存之间的数据交换通过数据页来执行,包括内存里更新后的脏数据,刷 回磁盘的时候,也是至少一个数据页刷回去。
    image.png
    我们再看下图,要明白的一点是,我们不是一直在内存里更新各种数据吗?当IO线程把内存里的脏数据刷到磁盘上去 的时候,也是以数据页为单位来刷回去的
    image.png