2013-03-07 202 views
4

我有一個緩慢的數據庫查詢運行第一次運行18秒和任何後續運行4秒。 我正試圖優化它的「冷啓動」執行時間。但無法連續重現。MySQL刷新查詢緩存

select SQL_NO_CACHE指令沒有幫助。下面

命令不會讓它再次試驗18秒時:

FLUSH QUERY CACHE; 
RESET QUERY CACHE; 
FLUSH TABLES; 

即使重新啓動數據庫不讓它長再次運行。

是否有任何其他命令刷新緩存?

表引擎是InnoDB。

+0

什麼表引擎有問題? – 2013-03-07 09:55:32

+0

表引擎是InnoDB – 2013-03-07 09:56:50

+0

嘗試清空innodb緩衝池。另一方面,爲什麼不讓查詢正常運行? – 2013-03-07 09:57:31

回答

9

讓我解釋它爲什麼沒有幫助。

Your Requirement:在這裏,您正試圖再次運行相同的查詢,但您希望它只在清理緩存時作爲其運行的第一次執行。

當查詢運行時,會有多種類型的緩存進入圖片。 '查詢緩存'是我們討論的最常見的緩存,然後是MySQL緩存(例如Innodb緩衝池),table_cache(在InnoDB級別,MySQL級別爲&),操作系統緩存,硬件緩存。

select SQL_NO_CACHE :這將阻止正在運行的查詢保存任何「查詢緩存」,這意味着如果您將再次運行相同的查詢,而不會有任何「查詢緩存」,但其他緩存將存在圖片中。

FLUSH QUERY CACHE :這只是碎片整理「查詢緩存」,以更好地利用其存儲

RESET QUERY CACHE :刪除從「查詢緩存」的所有查詢結果,如果使用這不會影響「SQL_NO_CACHE」,以前所有的查詢。

  • 除了您正在嘗試的操作之外,還有更多的事情可以嘗試避免使用這些緩存。
  • MySQL重新啓動必須爲'MySQL Caches'(Innodb緩衝池), 沒有其他辦法。
  • set global key_buffer_size = 0;使關鍵緩衝區大小爲零
  • set global query_cache_type = 0;
  • set global query_cache_size = 0;
  • OS級緩存:this後可以幫助你
0

我通常會將一個用戶定義的變量添加到查詢中,以便它跳過查詢緩存。但不確定,你可以用這種方式模擬冷啓動。

SELECT a.* 
FROM a, (SELECT @a:=NULL) as foo; 
+0

現在嘗試:沒有幫助。 – 2013-03-07 10:06:24