Mysql中buffer pool是什么

  • buffer pool主要用于缓存数据库中的表和索引的数据页。

  • 减少磁盘IO,数据库的数据通常存储在磁盘上。当查询需要读取数据时,如果数据已经存在于 Buffer Pool 中,查询就可以直接从内存中获取,避免了对磁盘的实际读取,从而提高了查询性能。

  • Buffer Pool 主要用于 InnoDB 存储引擎,因为 InnoDB 是 MySQL 中最常用的事务性存储引擎。其他存储引擎,如 MyISAM,不使用 Buffer Pool。

如果设置的很小会导致什么情况
  • 如果太小会导致磁盘IO增加。

  • 可能会导致锁之间的竞争。

如何查看和配置buffer pool

查看命令如下

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

innodb_buffer_pool_size 是一个用于设置 Buffer Pool 大小的配置参数,通常根据系统内存的总量进行调整。

SET GLOBAL innodb_buffer_pool_size = 1G; 
-- 例如,将 Buffer Pool 大小设置为 1GB
监控和优化buffer pool
  • 监控 Buffer Pool 的命中率是评估性能的重要指标。Buffer Pool 命中率是指从内存中获取数据页的次数与总的读取次数之比。如果命中率较低,可能需要调整 Buffer Pool 的大小,以适应数据库工作负载的需求。

Buffer Pool 的命中率计算

监控Buffer Pool的命中率,还需要了解另外两个参数

  1. Innodb_buffer_pool_read_requests:

    • 表示从 Buffer Pool 中读取的总请求数。这包括了直接从内存中获取的次数以及尝试从磁盘中获取但最终由于在 Buffer Pool 中找到的次数。

  2. Innodb_buffer_pool_reads:

    • 表示从磁盘读取的总次数。这是无法从 Buffer Pool 中满足的读取请求的次数。

在mysql中可以用下面命令查看上述状态的值

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';

通过这两个状态变量,可以计算 Buffer Pool 的命中率,公式为:

Buffer Pool 命中率 = 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)

当 Buffer Pool 命中率接近 100% 时,表示大多数的读取请求都能够从内存中直接获取,性能较好。而当命中率较低时,表示有较多的读取请求需要从磁盘中读取,可能需要考虑调整 Buffer Pool 的大小或者优化查询等操作。


Redis导致CPU飙升可能是什么原因。

  • 可能是Redis的RDB备份导致的,因为RDB会有个压缩算法。

  • 可能是Redis的慢查询,例如keys

  • 可能是的连接数过多


Java类加载的过程

java类的加载过程是动态的,它不会一次性把程序所有的类全部加载后再运行,而是先保障程序运行的基础类加载到JVM虚拟机当中,其他的类,一般是再需要的时候才会去加载,这样的运行机制也达到了节约内存的目的。

当JVM虚拟机加载某个class文件的时候,采用的是双亲委派模式(任务委派模式),就是将请求交给父类去处理。

双亲委派机制的概念

双亲委派机制是指,当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候,才会由当前这个加载器来负责类的加载


B+树

结构如下

b+树.webpB+ 树与 B 树差异的点,主要是以下这几点:

  • 叶子节点(最底部的节点)才会存放实际的数据(索引+记录) 非叶子节点只会存放索引

  • 所有的索引都会在叶子节点出现,叶子节点之间构成了一个有序链表(让查询范围和有序遍历更高效)

  • 非叶子节点的索引也会存在子节点中,并且该索引在子节点所有索引中最大或者最小(有助于提高检索效率)

  • 非叶子节点中有多少个节点就有多少个索引

有序、平衡、快速查找和插入