我为同一个数据库设置了生产设置和开发设置。有一个表在生产中有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。由于这个问题,我的查询经常在生产中超时。
答案 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;