MySQL的“Key Efficiency”是什么?

57
MySQL Workbench在与服务器健康相关的情况下报告了一个称为“关键效率”的值。这是什么意思,有什么影响?

alt text

来自MySQL.com,"键效率"是:

...表明实际key_reads结果的key_read_requests数量。

好的,那这是什么意思?这告诉我如何调整服务器?


你是使用MyISAM表还是InnoDB? - Martin
@Martin,我在询问这些值本身的含义,而不是尝试调整任何特定的MySQL实例。这张图片只是一个示例,旨在展示如何找到信息。 - tylerl
3
在调整服务器方面,您使用的存储引擎(MyISAM vs InnoDB vs ...)将影响您需要调整的变量。对于MyISAM,关键缓冲区大小至关重要。对于InnoDB,它是innodb_buffer_pool_size。这些会影响可以在MySQL地址空间中缓存多少关键字。一般来说,缓存越多越好。但是,正如Michael Eakins所指出的那样,如果您的系统有大量内存,则文件系统无论如何都会缓存大部分索引。 - Martin
1
@Martin 如果您将答案放在答案部分而不是评论中,那么我们可以对其进行投票、添加评论等。 - tylerl
这个MySQL Workbench中的指标似乎只与MyISAM相关。 在我的基于InnoDB的RDS实例中,它总是显示为0.0%。 - undefined
2个回答

88
“关键效率”是一个指标,用来衡量MySQL内存中的索引缓存所提供的价值。如果您的关键效率很高,那么通常情况下MySQL会从内存空间执行关键字查找,这比从磁盘检索相关索引块要快得多。
提高关键效率的方法是将更多系统内存专门用于MySQL的索引缓存。如何做到这一点取决于您使用的存储引擎。对于MyISAM,增加key-buffer-size的值。对于InnoDB,增加innodb-buffer-pool-size的值。
然而,正如Michael Eakins所指出的那样,操作系统还具有最近访问的磁盘块的缓存。您的操作系统可用的内存越多,它可以缓存的磁盘块就越多。此外,磁盘驱动器本身(在某些情况下还有磁盘控制器)也具有缓存——这也可以加速从磁盘检索数据。等级结构有点像这样:
1. 最快 - 从MySQL的索引缓存中检索索引数据。成本仅为一些内存操作。 2. 检索保存在操作系统文件系统缓存中的索引数据。成本是一个系统调用(用于读取)和一些内存操作。 3. 检索保存在磁盘系统缓存(控制器和驱动器)中的索引数据。成本是一个系统调用(用于读取),与磁盘设备通信以及一些内存操作。 4. 最慢 - 从磁盘表面检索索引数据。成本是一个系统调用,与设备通信,还要物理移动磁盘(臂的运动+旋转)。
实际上,1和2之间的差异几乎不可察觉,除非您的系统非常繁忙。此外,除非您的系统可用的闲置RAM少于磁盘控制器,否则很少有情况下会出现第3种情况。

我曾经使用过带有相对较小(512MB)索引缓存但具有大量系统内存(64GB)的 MyISAM 表的服务器,但发现很难证明增加索引缓存大小的价值。这取决于你的服务器上还发生了什么事情。如果你只运行 MySQL 数据库,那么操作系统缓存可能会非常有效。但是,如果在同一台服务器上运行其他作业,并且这些作业使用大量内存/磁盘访问,则可能会使有价值的缓存索引块被驱逐,从而导致 MySQL 更频繁地访问磁盘。

一个有趣的练习(如果你有时间的话)是调整你的系统使其变得更慢。在大型表上运行标准工作负载,将 MySQL 缓冲区减少到影响变得明显。通过将大量(大于 RAM)无关数据通过文件系统传输来刷新文件系统缓存(cat large-file > /dev/null)。观察查询运行时的 iostat。

“键效率”不是衡量键的好坏的指标。设计良好的键将对性能产生比高“键效率”更大的影响。不幸的是,MySQL 在这方面没有太多帮助。


7
Key_read_requests是从缓存中读取键块的请求数。而key_reads是从磁盘物理读取键块的次数。因此,这两个变量可以独立增加。(http://bugs.mysql.com/bug.php?id=28384)。
这仍然不太清楚。接下来是更多的解释:
部分有效的Key_reads用法
有一个部分有效的理由去检查Key_reads,假设我们关心发生的物理读取次数,因为我们知道相对于计算机的其他部件,磁盘非常慢。现在我回到了我之前所说的“大多数是事实”的地方,因为Key_reads实际上根本不是物理磁盘读取。如果请求的数据块不在操作系统的缓存中,那么Key_read就是一次磁盘读取——但如果它被缓存了,那么它只是一个系统调用。然而,让我们做出我们的第一个难以证明的假设:
难以证明的假设#1:一个Key_read可能对应着一个物理磁盘读取,也可能不是。如果我们把这个假设视为真实的话,那么我们还有哪些原因关心Key_reads呢?这个假设导致了“缓存未命中比缓存命中慢得多”,这是有道理的。如果Key_read和Key_read_request做的事情一样快,那么键缓冲区还有什么用呢?让我们相信MyISAM的创造者,在这件事上他们设计了一个缓存命中比未命中更快。(http://planet.mysql.com/entry/?id=23679

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接