这是我写的sql查询,工作正常,但速度慢。
SELECT D.Username,
SUM(CASE WHEN D.type = 'Yes' THEN 1 ELSE 0 END) as Yes,
SUM(CASE WHEN D.type = 'No' THEN 1 ELSE 0 END) as No,
SUM(CASE WHEN D.type = '' THEN 1 ELSE 0 END) as Other,
SUM(CASE WHEN S.mobile IS NULL THEN 0 ELSE 1 END) as Sales,
COUNT(*) as TOTAL FROM dairy as D
LEFT JOIN (SELECT DISTINCT mobile FROM sales) as S on D.MobileNo = S.mobile
WHERE source = 'Network' AND UNIX_TIMESTAMP(CheckDate) >= 1309474800 AND UNIX_TIMESTAMP(CheckDate) <= 1309561200
group by D.Username order by TOTAL DESC
如您所见,它计算的是,否,其他和匹配的mobileno(
D.MobileNo = S.mobile
)销售数字。我试过在type、username、mobile、mobileno、checkdate和source中添加索引——性能并没有提高多少。
最佳答案
在查询中要注意三点:
一。“left join”可能会给您带来性能问题。
但是,您需要它,因为D.MobileNo
中可能不存在SELECT DISTINCT mobile FROM sales
值。任何其他工作(是的,有选择)都很可能会降低性能。但是通过观察下一个项目,你的表现可能会有所提高。
2.确保在键列中有索引:
D.类型
移动电话
莫比尔诺
d.用户名
D.来源
D.检查日期
三。按“unix”时间戳(checkdate)筛选可能有问题`
这可能是关键问题。您可能在按UNIX_TIMESTAMP(CheckDate)
而不是CheckDate
筛选时遇到问题,特别是当Dairy
有大量记录时。问题是,即使您有一个CheckDate
的索引,也可能因为函数的原因而不使用它。尝试按CheckDate
本身过滤。
关于mysql - 优化报表的SQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6859687/