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中的数据包括:
- 数据页:B+树的叶子节点对应的数据页,存储实际数据。
- 索引页:B+树的非叶子节点对应的索引页,存储索引信息。
- 插入缓存页:缓存插入操作的二级索引数据。
- undo日志页:事务的undo日志,用于事务回滚和MVCC。
- 自适应hash索引页:存储InnoDB自动生成的hash索引,加速某些频繁访问的查询。
- 锁信息:存储锁的元数据。
总结
其实Buffer Pool还有很多问题需要了解,暂时先不深入了。之后再来填坑。