2009-11-12 96 views
3

我有一個幾百萬條記錄的表。在生產過程中,我們發現有一種特定類型的查詢需要幾秒鐘才能完成。如何避免mysql緩存

當我嘗試在已複製生產數據的計算機上重現問題時,我在mysql客戶端中運行了準確的查詢(從慢速查詢日誌中獲取),它花費了幾秒鐘的時間。如果我然後按下並重新輸入,則需要0.01秒。

我查閱了文檔以瞭解如何關閉緩存,以便始終如一地重現問題,並且想要測試添加索引是否有幫助。

這是我試過的:

RESET QUERY CACHE;平板電腦;

但是,在上述命令之後,再次運行相同的查詢仍然只需要0.01秒。

我必須缺少一些東西。有任何想法嗎?

+0

你已經試過SELECT SQL_NO_CACHE表。* FROM table ...? – Max 2009-11-12 15:57:19

回答

0

將表格加載到內存後,查詢應該花費的時間會大大減少。如果生產框每次運行查詢需要很長時間,我會開始查看內存使用情況。如果你發現你的生產箱交換了很多,我會考慮升級它的RAM。

0

的have_query_cache服務器系統變量指示查詢緩存是否可用:

mysql> SHOW VARIABLES LIKE 'have_query_cache'; 
+------------------+-------+ 
| Variable_name | Value | 
+------------------+-------+ 
| have_query_cache | YES | 
+------------------+-------+ 

當使用標準MySQL二進制,此值始終爲YES,即使查詢緩存被禁用。

其他幾個系統變量控制查詢緩存操作。這些可以在啓動mysqld時在選項文件或命令行中設置。查詢緩存系統變量都具有以query_cache_開頭的名稱。它們在第5.1.3節「服務器系統變量」中進行了簡要介紹,並提供了此處給出的其他配置信息。

http://dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html

4

您可以通過查詢SQL_NO_CACHE告訴服務器不將結果存放在查詢緩存:

SELECT SQL_NO_CACHE id, name FROM customer; 

除了查詢緩存雖然,有很多更回事爲了加快速度,MySQL內部緩存了有關表和索引的其他信息,以加快未來的查詢速度。查詢的第一次執行也會預熱操作系統文件緩存。

您真正需要做的是查詢EXPLAIN,並查看數據庫引擎需要分析的行數。通過研究它如何使用表索引(或不是),您將更好地瞭解可能缺少哪些索引或構建查詢的替代方法。

0

如果您無法關閉它,可以通過發出一組簡單的更新語句來交換查詢所選擇的數據,從而使查詢無效。

所以,如果你做到了。

update table set column = tmpval where id = 100; 
update table set column = originalval where id = 100; 

然後,當你再次查詢它會花費一段時間。

此外,請確保您對原始查詢做了解釋,它將幫助您診斷比大多數事情更快的錯誤。