和其他数据一样,内存对数据库的性能有着至关重要的影响。MySQLInnoDB也通过内存缓存数据。在访问数据时,它访问的是缓存在内存中的数据。数据,以提高数据访问效率。在MySQL中,通过showvariableslike'Innodb_buffer_pool%'命令或直接访问performance_schema.global_status系统表,可以获取数据库运行过程中内存或磁盘的读取状态。根据这个数据,可以计算出InnoDB正在读取数据。缓存中发生的内存或物理磁盘读写情况,即缓存效率。对于“缓存命中率”,SQLServer中也有这个概念,意思也差不多,但是SQLServer中的BufferCache命中率性能计数器或sys.dm_os_performance_counters计算的BufferCache命中率不能直接响应内存压力,原因归结为SQLServer在计算BufferCache命中率时,包含了预读这部分数据(预读部分的pages也算作cache***).对于MySQL的InnoDB引擎,也有类似逻辑读、物理读和预读的概念,所以在计算MySQL缓存的效率时,需要依赖预读这部分数据的信息。在判断内存压力的时候,要注意performance_schema.global_status中以下与InnoDB读写相关的参数。这里的次数是MySQL默认存储的页面大小。pagesize也可以通过performance_schema.global_status获取,单位为wordsections的个数,默认pagesize为16kbpagesNumberinnodb_buffer_pool_reads:··········································································································从物理案例读取页面的次数Innodb_buffer_pool_reads_ahead:························································································?????????????????????????????????????·ahead,但是没有预读从缓冲池中替换出来的页数,一般用来判断预读的效率Innodb_data_read:·········································································································································读取的字节数Innodb_data_reads:·····························································读取次数这些参数是从MySQL服务器启动时开始累积的。如果MySQL服务器重新启动,参数将被清除并且缓冲率将从一个新的开始增加。次数+物理读次数+预读次数)即:Innodb_buffer_pool_read_requests/(Innodb_buffer_pool_read_requests+Innodb_buffer_pool_reads+Innodb_buffer_pool_reads_ahead)我个人认为这个值的实时计算结果参考意义不大。如果直接根据查询到的值进行计算,则当前计算反馈的值是服务启动以来的平均值。在测量实际压力时,由于数据的压力是阶段性的,因此需要在一定时间内,按照一定的频率,采集一定时间内的逻辑读和物理读的数量。每个时间间隔内的次数、预读次数、缓存穿透率的计算都有参考意义。可能是忙碌期间内存压力大,空闲期间压力小,计算出的平均值意义不大。另外,缓存内存效率只能从一个方面反映内存的压力,并没有绝对值来判断压力高不高。缓存故障率有多高?就个人而言,我认为没有固定的数字。一定是99%还是某个值?主要看它相对于基线的波动,也取决于具体的具体环境。比如高速存储,根据对其他数据库的长期观察,因为物理存储优化或者比较强,即使有一定的物理读,物理IO延迟也不是很长,它是可以接受的。同时,内存压力的情况不仅仅是“内存不够大”,尤其是MySQL,受各种配置的影响,包括各种内存分配的大小,都会影响缓存效率。此外,还有两个实际问题。1、MySQL在测试时,如何清除表(或特定表)的缓存数据?2、强制清除缓存后(通过重启MySQL服务),查询Innodb_buffer_pool_read_requests和Innodb_buffer_pool_reads,再查询一张物理表,再次查询Innodb_buffer_pool_read_requests和Innodb_buffer_pool_reads,发现Innodb_buffer_pool_read_requests的增加量大于Innodb_buffer_pool_reads。重启后,第一次查询一张物理表前后,如下截图,物理读增加了2,逻辑读增加了5(测试表上没有索引)继续,查询测试的再次物理表,发现物理读没有增加(可以理解为缓存数据),逻辑读增加了4(多次测试目前情况还是一样),也就是说,对于两次物理读缓存中的数据,逻辑读每次增加4?不太明白这个参数是怎么算出来的(显然这里不涉及预读)。也就是说:MySQL缓存效率的计算不是这个公式:Innodb_buffer_pool_read_requests/(Innodb_buffer_pool_read_requests+Innodb_buffer_pool_reads+Innodb_buffer_pool_reads_ahead)?不禁想起了当时对sqlserver缓存效率的理解。当时中文资料都说是95%左右,中文资料基本上没有正确解释这个参数。当我实际观察服务器参数时,发现实际情况与理论完全不符。后来查英文资料发现不是这样的。
