mSQL的解释查询不一样的测试VS本地

问题描述:

我刚刚从试验机转储数据库到本地机器上运行,下面我查询: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

是的,但在查询优化期间也会考虑表的实际行计数 –

发生了什么是非常可能的,因为有时Mysql索引在不同的环境中并不完全相同,即使您拥有相同数量的数据。这完全是因为你如何操纵数据。例如,当您删除数据时,索引编号可能不会再次刷新所有数据,因此您可能仍有一些索引指向空数据。但是,当你解释时,这个空索引仍在被扫描。

您可以做一个测试,在一列上创建一个新的索引并开始插入和删除数据。然后重新创建它不同的相同索引名称,有时您会看到不同的索引号。