2010-10-02 69 views
51

MySQL Workbench报告一个与服务器健康关联的“关键效率”值。这意味着什么?它的含义是什么?什么是MySQL“关键效率”

alt text

MySQL.com, “主要效益” 是:

...的key_read_requests数量的指示,导致实际key_reads

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

+0

你使用MyISAM表或Innodb? – Martin 2010-10-02 19:51:54

+0

@Martin我正在询问这些值本身的含义,而不是试图调整任何特定的MySQL实例。图片只是一个示例,旨在显示在哪里可以找到信息。 – tylerl 2010-10-03 00:28:38

+3

在调整服务器方面,您正在使用的存储引擎(MyISAM vs InnoDB vs ...)将影响您需要调整的变量。对于MyISAM,密钥缓冲区大小非常重要。对于InnoDB,它是innodb_buffer_pool_size。这些影响可以在MySQL地址空间内缓存多少个密钥。一般来说,越好越好。但是,正如Michael Eakins所指出的,如果你的系统有很多内存,那么文件系统在任何情况下都会缓存大部分索引。 – Martin 2010-10-03 12:23:43

回答

73

“主要效益”是多少价值,你是从MySQL的内存中保存的索引缓存得到的指示。如果您的密钥效率很高,那么大多数情况下MySQL会在内存空间内执行密钥查找,这比从磁盘检索相关索引块要快得多。

提高关键效率的方法是将更多的系统内存专用于MySQL的索引缓存。你如何做到这一点取决于你使用的存储引擎。对于MyISAM,增加键缓冲区大小的值。对于InnoDB,增加innodb-buffer-pool-size的值。但是,正如Michael Eakins所指出的那样,操作系统还拥有最近访问过的磁盘块的缓存。您的操作系统可用的内存越多,它可以缓存的磁盘块越多。此外,磁盘驱动器本身(以及某些情况下的磁盘控制器)也具有缓存 - 这又可以加速从磁盘检索数据。层次结构有点像这样:

  1. 最快 - 从MySQL索引缓存中检索索引数据。成本是一些记忆操作。
  2. 检索保存在OS文件系统缓存中的索引数据。成本是系统调用(用于读取)和一些内存操作。
  3. 检索磁盘系统缓存(控制器和驱动器)中保存的索引数据。成本是系统调用(用于读取),与磁盘设备的通信以及一些内存操作。
  4. 最慢 - 从磁盘表面检索索引数据。成本是系统调用,与设备的通信,磁盘的物理移动(手臂移动+旋转)。

实际上,除非系统非常繁忙,否则1和2之间的差别几乎不明显。此外,情况3不太可能(除非您的系统具有比磁盘控制器少的备用RAM)。

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

一个有趣的练习(如果你有时间的话)是鼓励你的系统运行速度较慢。在大型表上运行标准工作负载,减少MySQL缓冲区,直到影响变得明显。通过文件系统(cat large-file>/dev/null)抽取大量(大于RAM)无关数据来冲洗文件系统缓存。当您的查询运行时观看iostat。

“关键效率”并不能衡量您的密钥有多好。精心设计的按键对性能的影响要远远大于“高效率”。不幸的是,MySQL没有太多的帮助你。

+1

感谢您的研究! – tylerl 2010-10-04 09:21:44

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