2014-10-02 75 views
0

我試圖用兩種方法來測量特定MySQL查詢的速度。MySQL分析顯示比PHP microtime差異查詢時間更慢

在MySQL

SET profiling = 1; 
QUERY; 
SHOW PROFILES; 

在PHP

$time = microtime(true); 
Database::instance()->query(...); 
$time = microtime(true) - $time; 

的時間從顯示配置文件被顯示爲〜0.009s(持續時間)。 從$時間顯示的時間是〜0.001秒。

我很困惑,因爲我期待PHP測量比MySQL測量慢。這沒有任何意義。有人可以解釋嗎?

編輯: 我知道緩存,我試過它與SQL_NO_CACHE,但它似乎沒有區別。但我注意到,當我重新啓動MySQL服務器時,前幾次性能分析嘗試與PHP報告的內容一致。但是,當我跑了剖析幾次,有在持續時間上突然跳躍:

1 0.00137900 SELECT COUNT(*) AS count ↵ 
2 0.00138800 SELECT COUNT(*) AS count ↵ 
3 0.00912700 SELECT COUNT(*) AS count ↵ 
4 0.00907300 SELECT COUNT(*) AS count ↵ 
5 0.00878900 SELECT COUNT(*) AS count ↵ 
6 0.00984200 SELECT SQL_NO_CACHE COUNT(*) AS count ↵ 
7 0.00895200 SELECT SQL_NO_CACHE COUNT(*) AS count ↵ 

打破,是以查詢〜0.009s,它出現在時間的跳躍是從創建一個TMP表。但前兩次它做得非常快(1和2)。基於PHP microtime(),它也非常快。與分析器的東西放慢後呢?

starting 0.000055 
checking permissions 0.000004 
Opening tables 0.000013 
System lock 0.000050 
optimizing 0.000010 
statistics 0.000041 
preparing 0.000012 
Creating tmp table 0.007696 
executing 0.000014 
Copying to tmp table 0.000317 
Sorting result 0.000031 
Sending data 0.000007 
removing tmp table 0.000423 
Sending data 0.000008 
init 0.000007 
optimizing 0.000011 
executing 0.000005 
end 0.000003 
query end 0.000011 
closing tables 0.000002 
removing tmp table 0.000004 

關閉表0.000006 釋放項目0.000054 登錄慢查詢0.000002 清理0.000003

+0

很多事情可能會導致這種小的差異。你的MySQL服務器和PHP運行在不同的機器上嗎?查詢是否返回大量數據?測量查詢間隔結束時,您的php客戶端可能尚未檢索到數據。 – 2014-10-02 19:04:35

+0

它們在同一臺機器上運行。查詢返回一個計數,幾乎沒有數據。 – allenylzhou 2014-10-02 19:18:15

回答

3

這是因爲SQL腳本執行後,查詢變得緩存。

因此,SQL腳本第一次運行查詢。結果被緩存。然後執行PHP腳本。該查詢已被緩存,因此檢索結果更快。


(奧利·瓊斯)

嘗試包括測量性能時,在查詢中SQL_NO_CACHE選項。

E.g。

SELECT SQL_NO_CACHE COUNT(*), SUM(col) 
    FROM table 

@奧利·瓊斯

但甚至還有緩存硬盤的水平I/O,這是獨立MySQL的緩存。

-ktm

1

查詢緩存應用於像ktm5124說,而且外形必須做的OS一些其他的操作,這將減緩查詢一般也有所下降。

你可以使用SQL_NO_CACHE參數測試這一點,並沒有探查比較PHP和MySQL的結果。

+0

我傾向於這個答案,正如你可以看到我的編輯。分析器似乎在做一些有趣的事情。你能詳細說明你的答案嗎? – allenylzhou 2014-10-02 19:17:36

+0

SQL_NO_CACHE只說結果沒有存儲在緩存中(但仍可以從緩存中讀出)。 因此,您需要重新啓動mysql,並在shell和php上執行相同操作(使用SQL_NO_CACHE參數表)才能獲得比較好的結果。我寧願使用EXPLAIN SELECT比探查器本身...該探查器適用於分析緩慢的查詢,但不是〜0.009的查詢差異...我希望這有助於。 – Dewstar 2014-10-02 19:21:35

+0

謝謝。但我現在非常確信造成這種差異的原因是由於磁盤上創建了臨時表。當PHP腳本運行時,它會創建一個新的SQL會話,因此所有臨時表都會被刪除,並在內存中創建臨時表。但是,當我繼續打開續集專業版會話並運行分析器幾次時,它最終決定將臨時表寫入磁盤。我不能確認這一點,但因爲我不知道如何查看臨時表,但我相信這將是答案。 – allenylzhou 2014-10-02 19:42:01