同一个表在不同的DB中不使用索引

时间:2014-04-23 07:16:13

标签: mysql sql performance database-performance query-performance

我为同一个数据库设置了生产设置和开发设置。有一个表在生产中有8000万条记录,它在开发中的行数较少。两个表都具有相同的日期索引。但是在使用EXPLAIN的生产表中,我可以看到查询没有使用任何索引并扫描所有行。但它是开发表,EXPLAIN显示它使用日期索引,因为类型是'范围'而关键是' date'。为什么会这样?

我的查询如下:

SELECT date(date) as date, SUM(amount) AS points FROM my_table 
WHERE date BETWEEN '2014-04-17' AND '2014-04-23' 
AND status NOT IN (3,4) AND type NOT IN (5) 
GROUP BY date(date) ORDER BY date DESC.

我有另一个复合索引,其中包含' date',' type'和'状态'。但它也没有使用它。我试过有没有GROUP BY。由于这个问题,我的查询经常在生产中超时。

1 个答案:

答案 0 :(得分:1)

这是由于索引碎片化造成的,首先在您的服务器上执行分析表,其中索引未正确使用。

注意:正如您在查询中提到的,两个服务器都有不同的表大小,那么mysql可能会根据自己的智能使用不同的索引。如果您知道查询的最佳选项,则可以使用强制索引。

Analyze table mytable;

然后检查是否仍然使用索引然后你需要重建索引,你可以使用下面的命令,但它会根据表大小锁定你的表很长时间,因此需要停机时间。

optimize table mytable;

如果您不想使用它们,那么您可以强制使用适当的索引。

SELECT date(date) as date, SUM(amount) AS points FROM my_table force index(myindex) 
WHERE date BETWEEN '2014-04-17' AND '2014-04-23' 
AND status NOT IN (3,4) AND type NOT IN (5) 
GROUP BY date(date) ORDER BY date DESC;