什么是MySQL“关键效率”

MySQL Workbench会报告一个与服务器运行状况相关的名为“Key Efficiency”的值。 这是什么意思,它的含义是什么?

替代文字

从MySQL.com来看,“关键效率”是:

…指示导致实际的key_reads

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

“关键效率”表示您从MySQL内存中的索引caching中获得多less价值。 如果你的密钥效率很高,那么MySQL通常会从内存空间中执行密钥查找,这要比从磁盘上检索相关索引块要快得多。

提高关键效率的方法是将更多的系统内存专用于MySQL的索引caching。 你如何做到这一点取决于你使用的存储引擎。 对于MyISAM,增加键缓冲区大小的值。 对于InnoDB,增加innodb-buffer-pool-size的值。

但是,正如Michael Eakins所指出的那样,操作系统也拥有最近访问过的磁盘块的caching。 您的操作系统可用的内存越多,可以caching的磁盘块越多。 此外,磁盘驱动器本身(以及某些情况下的磁盘控制器)也具有caching – 这又可以加速从磁盘检索数据。 层次结构有点像这样:

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

实际上,除非你的系统非常繁忙,否则1和2之间的差别几乎是不明显的。 而且,情况3也不太可能(除非你的系统备用RAM比磁盘控制器less)。

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

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

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

Key_read_requests是从caching中读取密钥块的请求数。 而key_reads是磁盘上密钥块的物理读取次数。 所以这2个variables可以独立增加。 ( http://bugs.mysql.com/bug.php?id=28384

这仍然像泥巴一样清晰。

接下来的一段解释是:

部分有效的使用Key_reads

假设我们关心发生的物理读取次数,有一个部分有效的理由来检查Key_reads,因为我们知道磁盘相对于计算机的其他部分非常慢。 这里是我回到上面所谓的“大多数的事实”的地方,因为Key_reads实际上不是物理磁盘读取。 如果所请求的数据块不在操作系统的caching中,则Key_read是一个磁盘读取 – 但是如果它被caching,那么这只是一个系统调用。 但是,让我们来做我们第一个难以certificate的假设:

难以certificate的假设#1:Key_read可能对应于物理磁盘读取,也许。 如果我们假设这个假设是真的,那么我们还有什么其他的理由来关心Key_read? 这个假设导致“高速caching未命中比caching命中慢得多”,这是有道理的。 如果将Key_read作为Key_read_request一样快,那么密钥缓冲会有什么用处呢? 让我们相信MyISAM的创造者,因为他们devise的caching命中速度比错过的要快。 ( http://planet.mysql.com/entry/?id=23679