1

这是我编写的 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 和来源 - 性能并没有提高多少。

4

2 回答 2

2

查询中需要注意的三点:

1. `LEFT JOIN` 可能会给你带来性能问题。

但是,您需要它,因为可能有一些D.MobileNo值不会出现在SELECT DISTINCT mobile FROM sales. 任何其他解决方法(是的,有选项)很可能会降低性能。但是通过观察下一个项目,您的表现可能会有所提高。

2. 确保在关键列中有索引:

  • D型
  • 移动电话
  • D.MobileNo
  • D.用户名
  • D.来源
  • D.检查日期

3.您可能在使用 `UNIX_TIMESTAMP(CheckDate)` 过滤时遇到问题

这可能是关键问题。您可能会遇到过滤UNIX_TIMESTAMP(CheckDate)而不是 的问题CheckDate,特别是如果Dairy有大量记录。问题是即使你有一个索引CheckDate,它也可能不会因为这个函数而被使用。尝试CheckDate自行过滤。

于 2011-07-28T13:38:22.463 回答
0

如果这是时间紧迫的,那么存储更多数据也是有意义的。

这意味着您在应用程序中为 YesValue、NoValue、OtherValue 添加 INT 列并用 0 或 1 填充它们。通过这样做,您可以从 SELECT 部分中删除案例计算。

还请发布当前可用的所有索引,并且正如评论所说的表的 CREATE 语句。

于 2011-07-28T13:37:15.990 回答