Mysql 存在减慢查询速度的公式。需要优化

Mysql 存在减慢查询速度的公式。需要优化,mysql,where,exists,Mysql,Where,Exists,如果没有这些行,查询将在大约20秒内运行。但是,使用上述线路,运行大约需要3分钟 竞选名单只有3700行,但正在缓慢而稳定地增长。是否有加快此查询的建议?请确保campiaign\u列表中有一个关于用户ID和注释的索引 另外,当notes='report16'或'report11'时,您可以使用函数索引来仅索引,但这可能对整个系统有好处,也可能没有好处 您可能还希望在同一索引中包含发送日期 WHERE AND NOT EXISTS (SELECT cl.userID

如果没有这些行,查询将在大约20秒内运行。但是,使用上述线路,运行大约需要3分钟


竞选名单只有3700行,但正在缓慢而稳定地增长。是否有加快此查询的建议?

请确保campiaign\u列表中有一个关于用户ID和注释的索引

另外,当notes='report16'或'report11'时,您可以使用函数索引来仅索引,但这可能对整个系统有好处,也可能没有好处

您可能还希望在同一索引中包含发送日期

WHERE   
AND NOT EXISTS
      (SELECT cl.userID
        FROM campaign_list cl
        WHERE cl.userID = customer_profile.userID
        AND (cl.notes = 'report12' or cl.notes = 'report16')
        )
    AND EXISTS
      (SELECT cl.userID
        FROM campaign_list cl
        WHERE cl.userID = customer_profile.userID
        AND cl.notes = 'report11'
        )
    AND
        (SELECT max(cl.send_date)
            FROM campaign_list cl
            WHERE cl.userID = customer_profile.userID
            AND cl.notes = 'report11'
        ) > lastSuccessfulDepositDate   
此外,在exists查询中执行select*比选择列名要快得多

另一个例子:
在活动列表发送日期中创建索引,notes='report11'

您是否有以下索引:活动列表用户ID、备注、发送日期?这将是三个子查询的最佳索引

那么,我会问,你有没有分别尝试过每种情况?也就是说,你知道每一个都需要1分钟吗。或者,一个是00:02:59,另两个是00:00:01

您可以将这三个条件简化为以下两个:

create index on campaign_list (notes, user_id, send_date)
这里也适用相同的索引


注意:在这种情况下,in不会真正影响性能,但它更易于写入和读取。

根据每个表中的行数,in和NOT in也可能会根据您的机器配置和内存提供更好的结果

例如:

WHERE   
AND NOT EXISTS
      (SELECT cl.userID
        FROM campaign_list cl
        WHERE cl.userID = customer_profile.userID AND
              cl.notes IN ('report12', cl.notes = 'report16')
        )
    AND EXISTS
      (SELECT cl.userID
        FROM campaign_list cl
        WHERE cl.userID = customer_profile.userID AND
              cl.notes = 'report11' and
              cl.send_date > ?.lastSuccessfulDepositDate
        )

了解每个表中的行数会有所帮助

userid是主键。notes和send_date具有重复的值。因此,为什么我要使用maxsend_date,我可能想使用一个brin索引,但是重复的值不是问题。索引不一定是唯一的,也不应该被认为是唯一的。试试我说的,然后把结果贴出来。。。有时,反复试验胜过过度思考。userid是什么的主键?我建议的索引不在customer_profile上,而是在campaign_list上-当然有重复的值,如果索引不是campaign_list的主键,则索引将有所帮助。在campaign_list表中:userid是主键。notes和send_date具有重复的值。因此,我使用maxsend_Date的原因是我分别尝试了这三种情况。notexists=2:10,exists=1:55,maxsend\u date=1:52。userid是主键。notes和send_date具有重复的值。因此,我使用maxsend_date。如果我创建一个索引,它是临时的还是永久的?也就是说,我没有能力向我的数据库中添加内容。你可能想使用函数索引或部分索引,至少你试过3个单独的索引了吗?是否有哪一行的负面影响更大?返回了多少行?主表中有多少行?这里没有提到的一个包含lastsuccessfuldepositdate活动列表中有多少行?我分别尝试了这三个。Not exists=2:10,exists=1:55,maxsend_date=1:52主表(即FROM)是客户配置文件表:143604行。活动列表只有3308行。存在的位置c.notes='report11'似乎没有必要,因为它下面有max子查询…主表(也称为FROM)是customer profile表:143604行。活动列表只有3308行。您最好使用我当时建议的in而不是in查询,因为它只需遍历活动列表表一次,而不是143K次-特别是因为您不想为注释或日期编制索引。。。
 where
 customer_profile.userID not in
 (
  (SELECT cl.userID
    FROM campaign_list cl
    WHERE cl.notes not in ('report12','report16')
    [perhaps some other predicate here that's also in the main query]
    )
 )...