您發現後續執行相同查詢的運行速度更快並不一定意味着查詢結果正在被緩存,或者查詢緩存正在返回查詢的後續執行。
可能是在第一次執行查詢時,必須訪問的索引和/或數據塊不在InnoDB緩衝池或MyISAM密鑰緩存中,必須從磁盤中檢索。這些塊將保留在InnoDB緩衝池和MyISAM密鑰緩存中,完全獨立於MySQL查詢緩存。如果它們仍然在內存中,後續對這些塊的訪問可能會更快地返回。
通常情況下,你不想從InnoDB緩衝池或MyISAM鍵緩存來衡量業績刷新塊。相反,您希望多次運行查詢,併爲第一次執行耗費時間。
如果您想從InnoDB緩衝池或MyISAM密鑰緩存中沒有任何塊開始,請關閉並重新啓動MySQL服務器。
但即使這些塊不在InnoDB緩衝池或MyISAM密鑰緩存中,也可能這些塊仍可能位於OS文件系統緩存中的「內存」中。所以爲了確保你從磁盤讀取數據塊,你還需要刷新OS文件系統緩存。
以下是從涉及到Oracle的湯姆凱特(AskTom)文章的摘錄,但是同樣的推理適用於其他RDBMS系統(包括MySQL)真。
http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html
清空緩存
問:有沒有辦法刷新[緩衝區高速緩存] ...這對於一個接一個地嘗試幾個方法的調優練習很重要,但我們希望減少緩衝區中預先存在的塊的影響,而不要重新啓動數據庫。
答:其實,一個調整工具不這樣做是很重要的。運行測試非常重要,忽略結果,然後運行兩到三次並取平均值。在現實世界中,緩衝區緩存將永遠不會有結果。決不。調整時,您的目標是減少邏輯I/O(LIO),因爲然後物理I/O(PIO)會自行處理。
考慮一下:刷新共享池和緩衝區緩存更不人道。我懷疑,大多數人似乎對此持懷疑態度,因爲它在傳統智慧面前蒼蠅。我會告訴你如何做到這一點,但不是所以你可以使用它進行測試。相反,我會用它來證明它爲什麼是徒勞的,完全是人爲的(因此導致錯誤的假設)。我剛開始使用我的電腦,並且已經在一張大桌子上運行了這個查詢。我「沖洗」緩衝區緩存並再次運行它:
所以是有可能在緩衝區中清除這些塊,所以我可以採取查詢重複或多或少同一時間。如果是,這是清除它的變量。如果不是,我們還可以測試mysql的查詢性能。 – ramky 2012-07-31 18:55:16