理解 INNODB 缓冲池统计信息

Saf*_*ado 21 mysql innodb buffer-pool

在阅读了 mysql 文档中的这个页面后,我试图理解我们当前的 InnoDB 使用情况。目前,我们为缓冲池分配了 6GB 的 RAM。我们的数据库大小差不多。这是来自show engine innodb status\G(我们正在运行 v5.5)的输出

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]
Run Code Online (Sandbox Code Playgroud)

我想知道我们如何很好地利用缓冲区缓存。在最初瞥了一眼输出之后,似乎我们确实在使用它,基于Pages made young并且not young有数字和Buffer pool hit rate is 1000 / 10000(我在网络上的其他地方看到这意味着它被大量使用。真的吗?)

让我陷入循环的是为什么young-making rateandnot都在 0/1000 并且young/sandnon-young/s访问都在 0。这些都表明它根本没有被使用,对吧?

任何人都可以帮助理解这一点吗?

Rol*_*DBA 29

The Buffer pool size 393215 这是页数而不是字节数。

要查看以 GB 为单位的缓冲池大小,请运行以下命令:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;
Run Code Online (Sandbox Code Playgroud)

Database pages 360515 这是缓冲池中包含数据的页数

要查看以 GB 为单位的缓冲池大小中的数据量,请运行以下命令:

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;
Run Code Online (Sandbox Code Playgroud)

要查看正在使用的缓冲池的百分比,请运行以下命令:

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;
Run Code Online (Sandbox Code Playgroud)

Modified db pages 300这是缓冲池中必须写回数据库的页数。它们也称为脏页。

要查看脏页面占用的空间,请运行以下命令:

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;
Run Code Online (Sandbox Code Playgroud)

要查看脏页面的百分比,请运行以下命令:

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;
Run Code Online (Sandbox Code Playgroud)

至于显示中的其他内容,请运行:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
Run Code Online (Sandbox Code Playgroud)

您将看到缓冲池的所有状态变量。您可以对需要检查的任何内容应用相同的查询。

  • 0 / 1000 的年轻化率告诉您,您正在运行的查询的数据页不仅都适合缓存,它们适合年轻缓存的较小 (3/8) 大小。也就是说,查询没有使用足够的数据来将某些页面老化到大型非年轻缓存中。 (2认同)

Mic*_*bot 18

 Buffer pool hit rate is 1000 / 1000
Run Code Online (Sandbox Code Playgroud)

在您所处的情况下,这是唯一真正有意义的值……而这种情况是您很幸运拥有一个完美的 100% 命中率的缓冲池。不要过度分析其余部分,因为您不需要更改任何内容,除非服务器操作系统内存不足,导致交换。

在缓冲池压力为零的情况下,年轻/非年轻值并不有趣。InnoDB 正在使用它,没有它它什么也做不了。如果池太小,页面会被逐出,新页面会被读取,其他统计信息可以帮助您理解这一点……但这是您似乎没有的问题。

如果出于任何原因需要,池中的免费“未使用”空间永远不会被 InnoDB 忽略或闲置,因此它是免费的这一事实仅意味着您有一些喘息空间可以扩展到您的工作规模数据集增长。

这就是全部意思,当然,除非您最近重新启动了服务器,在这种情况下,它是不完整的.. 在统计数据说明整个故事之前,服务器需要运行完整的“正常”使用期(包括完整备份) ...无论是一小时、一天、一周、一个月还是一年,都取决于您的应用程序。


Ric*_*mes 6

我不同意“你很幸运拥有一个完美的 100% 命中率的缓冲池”的评价

在输出的顶部(被切掉),是一行类似的东西:

Per second averages calculated from the last 16 seconds
Run Code Online (Sandbox Code Playgroud)

这对我说在最后 16 秒内没有读取发生,从而(人为地)给你一个完美的“1000/1000”分数。

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Run Code Online (Sandbox Code Playgroud)

与此同时,有一些写作。这些可能是用于刷新“脏”页面或从“更改缓冲区”清除索引的延迟写入。

可能在最后 16 秒内年轻/热区也没有活动。