2013-01-31 58 views
0

我有一個SQL查詢,我試圖優化。有趣的是,在一臺MySQL服務器上,查詢運行時間大約爲0.06秒,這讓我很滿意,但在另一臺服務器上,查詢時間接近0.2秒(兩倍)。爲什麼在一臺服務器上這個MySQL查詢比另一臺服務器慢?

SELECT fo.facets_id, fo.facets_options_id, fo.value 
FROM facets_options fo 
INNER JOIN categories_facets cf ON cf.facets_options_id=fo.facets_options_id 
INNER JOIN categories c ON c.categories_id=cf.categories_id 
WHERE fo.facets_id="2" 
AND fo.language_id = "1" 
AND c.enabled=1 
GROUP BY fo.facets_options_id 
ORDER BY fo.value ASC; 

的「解釋」這兩個服務器上的輸出是相同的:

id   select_type   table type possible_keys            key    key_len ref      rows Extra 
1   SIMPLE    fo  ref PRIMARY,facets_options_id,facets_id,facets_id_2   facets_id   4  const      986 Using where; Using temporary; Using filesort 
1   SIMPLE    cf  ref PRIMARY,categories_id,categories_id_2,facets_options_id facets_options_id 4  mydb.fo.facets_options_id 37 
1   SIMPLE    c  eq_ref PRIMARY,enabled           PRIMARY   4  mydb.cf.categories_id  1 Using where 

上查詢運行速度慢是使用MySQL 66年5月1日的服務器,並在其上快速的服務器使用MySQL 5.5.29。

是否有可能新版本的MySQL在優化查詢方面做得更好?或者還有其他可能導致它的東西?我怎樣才能找到更多關於幕後發生的事情?

+0

你有這個實驗的對照組嗎? –

+0

MySQL 5.5確實帶來了很多性能改進,尤其是對於InnoDB和多線程環境。 –

+0

這是因爲mysql版本的差異 –

回答

2

我假設你的硬件在兩臺服務器上都是一樣的。

您可以使用Profiler查看差異來自哪裏。

SET profiling = 1; 
SELECT /*yourquery...*/ 
SHOW PROFILES; 
/*lookup the id for your query*/ 
SHOW PROFILE FOR QUERY 1 /*or whatever id your query has*/ 

你會得到一個詳細清單,什麼花了多長時間等等...

也有EXPLAIN EXTENDED,通過它可以看到優化查詢。

手冊中的一個示例是here

除此之外,很可能是,差異來自不同的MySQL版本。

Percona確實調查過從5.1到5.5的性能改進。結果是here

+0

你如何「查詢你的查詢ID」? – mcmillab

+0

執行'SHOW PROFILES'命令時,您將看到自SET'profiling = 1;'命令以來執行的查詢列表。你還會看到這個查詢的ID。 – fancyPants

相關問題