2010-10-02 72 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