Mysql的内存使用
Mysql虽然将所有的数据持久化在磁盘上,但是不可能每次查询、更新都直接对磁盘操作,那样效率也太低了。Mysql在实际sql语句执行过程中会充分利用内存进行加速读、写、排序、连接等。
buffer pool
buffer pool是Innodb引擎的数据缓冲区。它主要有两个功能,一个是加速读,一个是加速写。当Innodb从磁盘上读取数据之后,会将数据存放在buffer pool中存储,之后下次查找直接从buffer pool中读取。当写入数据时,如果数据在buffer pool中已经存在就直接修改buffer pool中的数据,(同时也会写入binlog和redolog,防止buffer pool中的数据还没来得及持久化就宕机导致数据丢失),所以buffer pool中的数据永远是最新的。buffer pool中数据被修改后,数据页被标记为脏页,脏页会由后台线程定时写回磁盘。
changeBuffer
当数据在buffer pool中存在时,可以直接修改buffer pool从而加速写。但是当数据在buffer pool中不存在时呢?这种时候需要分两种情况讨论。
- 假如是需要修改唯一索引的字段,由于需要进行唯一性判断,因此必须访问磁盘查看数据是否存在。只要访问磁盘,读取到的数据就会被存放在buffer pool中,因此之后修改就可以直接修改buffer pool。
- 假如修改的是普通索引,则无需进行额外判断,因此也不必加载旧数据。此时mysql会直接将数据写入一块叫change buffer的区域中(change buffer是可以持久化的