MySQL【内存篇】

MySQL默认的InnoDB存储引擎使用了Buffer Pool来缓存数据和索引,提升性能。早期版本的MySQL在服务层使用了查询缓存来提升性能。这是两种不同的内存缓存机制。在讨论这两种机制之前,让我们先看一下InnoDB和MYISAM的区别,以了解InnoDB这一MySQL默认存储引擎。

InnoDB vs MYISAM

二者都是MySQL的存储引擎,适用场景不同:如果需要事务支持和高并发,适用InnoDB;如果读多写少,对事务要求不高,适用MYISAM。二者的区别可以总结为:

  • 事务:InnoDB支持事务,MyISAM不支持。
  • 锁粒度:InnoDB支持行级锁,MyISAM支持表级锁。
  • 外键:InnoDB支持外键,MyISAM不支持。
  • 索引:InnoDB支持聚簇索引,MyISAM支持非聚簇索引。前者叶子节点存储数据,后者叶子节点存储指向数据的指针。
  • MVCC:InnoDB支持多版本并发控制,MyISAM不支持。

这五个方面最终体现在读写性能和并发处理能力上。还有一个点是MyISAM的count(*)性能比InnoDB好,原因是MyISAM在存储数据时会存储行数,而InnoDB需要遍历数据来计算行数。

早期版本的MySQL查询缓存

查询缓存是查询命令和对应结果的集合,存储在内存中。在后来MySQL版本中,查询缓存被移除。

InoDB的Buffer Pool

InnoDB提供了Buffer Pool来缓存数据和索引,提升性能。

Buffer Pool存储的数据

在MySQL启动时,InnoDB就会申请Buffer Pool的虚拟地址空间,按照页划分,这里面的页叫做缓存页。当这些虚拟内存被访问之后,才会被映射到物理内存中。Buffer Pool中的数据包括:

  1. 数据页:B+树的叶子节点对应的数据页,存储实际数据。
  2. 索引页:B+树的非叶子节点对应的索引页,存储索引信息。
  3. 插入缓存页:缓存插入操作的二级索引数据。
  4. undo日志页:事务的undo日志,用于事务回滚和MVCC。
  5. 自适应hash索引页:存储InnoDB自动生成的hash索引,加速某些频繁访问的查询。
  6. 锁信息:存储锁的元数据。

总结

其实Buffer Pool还有很多问题需要了解,暂时先不深入了。之后再来填坑。