【发布时间】:2011-12-03 00:48:50
【问题描述】:
我有以下查询:
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)
感谢您的帮助。
更新:
现在我在 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 上有一个索引,但性能很慢。什么是完美的解决方案? 谢谢
【问题讨论】:
-
如果
sid不能是NULL,使用COUNT(*)而不是COUNT(sid) -
还有一个问题:
fDate是DATE类型还是DATETIME类型? -
fDate 是一个日期类型。我会尝试其他技巧。谢谢
-
注意(例如)
WHERE fDate BETWEEN '2011-06-01' AND '2011-06-02'的查询使用了一些索引,但你的没有,你不能做太多。 MySQL 决定(通常是正确的!)最好不使用任何索引,而是使用表的完整扫描(很大)部分。 -
(fDate, cid)索引之所以有效,是因为您拥有DISTINCT cid。您的查询必须为每个fDate查找有多少不同的cid存在。如果它可以使用索引来完成(无需从表中读取任何数据),则比扫描整个表要快。