这是我写的 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
如您所见,它会计算 Yes、No、Other 和匹配的 MobileNo (D.MobileNo = S.mobile
) 销售的数量。
我已经尝试为类型、用户名、手机、MobileNO、CheckDate 和来源添加索引 - 性能没有太大改善。
最佳答案
查询时需要注意三点:
1。 `LEFT JOIN` 可能会给您带来性能问题。
但是,您需要它,因为 D.MobileNo
值可能不会出现在 SELECT DISTINCT mobile FROM sales
中。任何其他解决方法(是的,有选项)很可能会降低性能。但您的表现可能会通过观察下一个项目得到改善。
2。确保在关键列中有索引:
- D型
- S.mobile
- D.Mobile否
- D.用户名
- D.Source
- D.CheckDate
3。您可能在按 `UNIX_TIMESTAMP(CheckDate)` 过滤时遇到问题
这可能是关键问题。您可能在按 UNIX_TIMESTAMP(CheckDate)
而不是 CheckDate
过滤时遇到问题,特别是如果 Dairy
有大量记录。问题是,即使您有 CheckDate
的索引,也可能不会因为函数的原因而被使用。尝试按 CheckDate
本身进行过滤。
关于mysql - 优化报告的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6859687/