2015-12-02 55 views
1

我剛剛從試驗機轉儲數據庫到本地機器上運行,下面我查詢:mSQL的解釋查詢不一樣的測試VS本地

SELECT advert_id,A.category_id,A.subcategory_id,subcategory,model_id,model,make,price,price2,gst,cndtn,currency,photo_id, SUM(S.visits) AS visits 
FROM adverts A 
LEFT JOIN subcategories SC ON A.subcategory_id = SC.subcategory_id 
LEFT JOIN photos P ON P.sale_id = A.advert_id AND P.thumb=1 AND P.sale_type_id=1 
LEFT JOIN ( 
SELECT 
entity_id , visits 
FROM 
sitestats_ga 
WHERE 
entity_type_id=1 AND (date <= DATE_FORMAT(NOW(), "%Y%m%d") && date >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 10 DAY), "%Y%m%d")) 

) S ON A.advert_id = S.entity_id 
WHERE '2015-12-02 06:44:55' >= A.datetime_added AND '2015-12-02 06:44:55' < A.datetime_removed AND A.sold_currency = '' AND (A.subcategory_id = '500' OR A.category_id = '100') 
GROUP BY A.advert_id 
ORDER BY visits DESC, A.datetime_added DESC 
LIMIT 0,12 

不幸的是,結果時間爲TEST與地方的不同,來驗證此我嘗試在mysql中使用EXPLAIN,它們也不同。

解釋結果在測試 enter image description here

解釋當地的 enter image description here

因此只要注意一下,我有數據庫的一個新的轉儲到我的地方,這意味着它們具有相同的索引並且在看到EXPLAIN結果後我已經驗證過它。

今天運氣好了,在PROD上運行查詢,結果和我的LOCAL一樣,我期待該測試應該與PROD相同,但我認爲DB有差異,所以現在我想修復測試環境。

如何在這個問題上挖掘更多?我需要做更多的事情?

+2

'possible_keys'在兩個屏幕截圖上都是相同的 - 唯一不同的是實際選擇的'keys'。 MySQL根據您獲得的行數和數據表的當前基數自動選擇最佳密鑰。如兩個屏幕截圖所示,表格內容完全不同(1.1k行vs 122k行) –

+0

@TobiasBaumeister但它們具有相同的索引設置。 –

+0

是的,但在查詢優化期間也會考慮表的實際行計數 –

回答

1

發生了什麼是非常可能的,因爲有時Mysql索引在不同的環境中並不完全相同,即使您擁有相同數量的數據。這完全是因爲你如何操縱數據。例如,當您刪除數據時,索引編號可能不會再次刷新所有數據,因此您可能仍有一些索引指向空數據。但是,當你解釋時,這個空索引仍在被掃描。

您可以做一個測試,在一列上創建一個新的索引並開始插入和刪除數據。然後重新創建它不同的相同索引名稱,有時您會看到不同的索引號。