2011-10-07 195 views
5

我有以下查询:MySQL查询提高性能

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) 
    FROM forwarding 
    WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY fDate 

解释给我下面的输出:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE forwarding index fDate,fDate_2 fDate_2 3  1481127 Using where 

你可以看到,有大量的数据。 总工作时间为12秒。 我该如何提高性能?我不知道我可以做更多的设置索引。

有我的索引此表:

fDate (fDate, f_shop) 
fDate2(dDate), 
f_shop(f_shop) 

谢谢您的帮助。

UPDATE:

现在我在where子句中添加一列,查询慢得多然后之前。

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) FROM forwarding 
WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" AND f_shop=10077 GROUP BY fDate 

我有一个关于forwardDate和f_shop的索引,但性能会变慢。什么是完美的解决方案? 谢谢

+0

尝试'(fDate,cid)'索引。 –

+0

如果'sid'不能为'NULL',请使用COUNT(*)而不是COUNT(sid) –

+0

问题:是'DATE'类型还是'DATETIME'类型的'fDate'? –

回答

3

除了ypercube的提供答案,你的查询,你正在寻找一个特定的商店......我会对

(f_shop,FDATE,CID)的指标,以确保所有3个部分该指数被用于与前面最小的WHERE子句预选赛..你最后的样品中,你已经包括在特定商店的兴趣......

SELECT 
     COUNT(sid), 
     fDate, 
     COUNT(DISTINCT(cid)) 
    FROM 
     forwarding 
    WHERE 
      f_shop=10077 
     AND fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY 
     fDate 
+0

是的,非常感谢。订单的重要性是否重要?我怎么知道fDate和f_shop是不够的? – user954740

+1

@ user954740,是的,顺序很重要,应该按照您试图在普通查询基础上找到的最细粒度的部分。在这种情况下,我会假设F_SHOP,因为您可以有100多个F_SHOP条目。因此,首先按日期范围扫描,您仍然可以跳过所有其他“商店”。通过在第一个位置上,你正在开始与一家商店,然后在那里,只有你关心的日期范围。 – DRapp