MYSQL不起作用-如何改进并更快地实现

MYSQL不起作用-如何改进并更快地实现,mysql,Mysql,我有一个CRM,其中一个查询如下: SELECT DISTINCT tb1.customerID FROM sales_company AS tb1 WHERE rdate BETWEEN '2016-02-01' AND '2016-02-14' AND type='payment' AND customerID NOT IN (SELECT customerID

我有一个CRM,其中一个查询如下:

SELECT DISTINCT tb1.customerID 
  FROM sales_company AS tb1
 WHERE rdate BETWEEN '2016-02-01' 
                 AND '2016-02-14' 
   AND type='payment' 
   AND customerID 
              NOT IN (SELECT customerID 
                        FROM sales_company 
                       WHERE rdate < tb1.rdate 
                         AND type='payment' 
                       GROUP BY customerID) 
 GROUP BY customerID`
通过这个查询,我可以得到新客户在查询期间第一次支付了多少费用

问题是: 我在每家公司都有很多表,所以每次刷新我都需要运行这个查询大约30次

对, 我知道这很糟糕,我建立的这个系统在7年前就已经很旧了,除了改变这个查询,我不能碰她太多

有一个很好的建议,你们知道如何改进这个查询以获得最后的行数吗


谢谢

您可以尝试一下:

SELECT customerID 
FROM sales_company 
WHERE type='payment'
GROUP BY customerID
HAVING COUNT(CASE WHEN rdate BETWEEN '2016-02-01' AND '2016-02-14' THEN 1 END) = 1 AND
       COUNT(CASE WHEN rdate < '2016-02-01' THEN 1 END) = 0

在customerID上有一个索引,rdate。

您能发布表类型、解释以及您的查询,看看有什么问题吗

EXPLAIN  SELECT DISTINCT tb1.customerID 
  FROM sales_company AS tb1
 WHERE rdate BETWEEN '2016-02-01' 
                 AND '2016-02-14' 
   AND TYPE='payment' 
   AND 
   NOT EXISTS (SELECT customerID 
                        FROM sales_company 
                       WHERE customerID = tb1.customerID
                         AND rdate < tb1.rdate 
                         AND TYPE='payment' 
             ) 
GROUP BY customerID;

我每次刷新仅测试10000行

30次?当数据刷新时,是否有间隔或每晚?“不在查询中”是否需要很长时间?创建一个视图,其中包含减少表总大小所需的日期。需要更多帮助。该子查询在该上下文中是多余的。您可以显示sales_company表的索引定义吗?我想问一下,该子查询的目的是什么?为什么要使用DISTINCT and GROUP BY the the同一字段?有数百万行,但是我已经测试了你的查询+@juanvan关于total表的建议,现在它工作得很好!