mysql - 优化报告的 SQL 查询

标签 mysql sql database sql-optimization

这是我写的 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/

相关文章:

php - 从 MySQL 数据库中获取 5 个随机行

javascript - 如何根据服务器上的内容更新客户端 JavaScript?

sql - 对特定文本的唯一约束

javascript - Bat 代码 Spigot 服务器

mysql - Zabbix 升级 - 数据库升级失败

mysql - DATE_FORMAT 在插入语句中不起作用

MySQL 的更新级联未更新父 FK

sql - 案例陈述和答案的除法始终为零

database - 是否有用于审计持久化对象的数据库设计模式?

mysql - 三元等效UML