Mysql 查询如何解决性能问题花费了大量时间

Mysql 查询如何解决性能问题花费了大量时间,mysql,sql,Mysql,Sql,查询至少需要20秒 我计划创建视图 但是如果有子查询,我们就不能创建视图 请给出一些关于创建视图的建议 欢迎提出任何其他建议 SELECT CAST(t.timecreated AS DATE) date, date_format(timecreated, '%d-%b-%Y'), SUM(t.enquiry_cnt) enquiry_cnt, (SELECT COUNT(DISTINCT lead_id) FROM

查询至少需要20秒
我计划创建视图 但是如果有子查询,我们就不能创建视图

请给出一些关于创建视图的建议

欢迎提出任何其他建议

SELECT 
    CAST(t.timecreated AS DATE) date,
    date_format(timecreated, '%d-%b-%Y'),
    SUM(t.enquiry_cnt) enquiry_cnt,
    (SELECT 
            COUNT(DISTINCT lead_id)
        FROM
            mg_lead_suggested_listing
        WHERE
            CAST(timecreated AS DATE) = CAST(t.timecreated AS DATE)
                AND source = 1) as lead_enquiry_cnt,
    SUM(t.suggested_cnt) suggested_cnt,
    (SELECT 
            COUNT(DISTINCT lead_id)
        FROM
            mg_lead_suggested_listing
        WHERE
            CAST(timecreated AS DATE) = CAST(t.timecreated AS DATE)
                AND source = 6) as lead_suggested_cnt,
    SUM(t.tot_cnt) tot_cnt,
    (SELECT 
            COUNT(DISTINCT lead_id)
        FROM
            mg_lead_suggested_listing
        WHERE
            CAST(timecreated AS DATE) = CAST(t.timecreated AS DATE)
                AND (source = 1 or source = 6)) AS lead_cnt,
    SUM(t.dropped_cnt) droped_cnt,
    (SELECT 
            COUNT(DISTINCT lead_id)
        FROM
            mg_lead_suggested_listing
        WHERE
            CAST(timecreated AS DATE) = CAST(t.timecreated AS DATE)
                AND (source = 1 || source = 6)
                && directory_status = 4) as lead_droped_cnt,
    sum(t.visit_pending_cnt) visit_pending_cnt,
    (SELECT 
            COUNT(DISTINCT lead_id)
        FROM
            mg_lead_suggested_listing
        WHERE
            CAST(timecreated AS DATE) = CAST(t.timecreated AS DATE)
                AND (directory_status = 3 && finl_status = 6)) as lead_visit_pending_cnt
FROM
    (SELECT 
        CASE
                WHEN source = 1 THEN 1
                ELSE 0
            END enquiry_cnt,
            CASE
                WHEN source = 6 THEN 1
                ELSE 0
            END suggested_cnt,
            CASE
                WHEN (source = 1 OR source = 6) THEN 1
                ELSE 0
            END tot_cnt,
            case
                when
                    ((source = 1 || source = 6)
                        && directory_status = 4)
                then
                    1
                else 0
            end dropped_cnt,
            case
                when (directory_status = 3 && finl_status = 6) then 1
                else 0
            end visit_pending_cnt,
            lead_id,
            timecreated
    FROM
        mg_lead_suggested_listing) AS t
group by CAST(t.timecreated AS DATE)
order by date desc
limit 10
仅供参考:此查询中没有联接
我只想从一个具有某些条件的表中进行计数

您应该能够使用条件聚合执行您想要的操作。查询将如下所示:

SELECT CAST(t.timecreated AS DATE) as date, date_format(timecreated, '%d-%b-%Y'),
       SUM(t.enquiry_cnt) as enquiry_cnt,
       COUNT(DISTINCT CASE WHEN source = 1 THEN lead_id END) as lead_enquiry_cnt,
       SUM(t.suggested_cnt) suggested_cnt,
       COUNT(DSTINCT CASE WHEN source = 6 THEN lead_id END) as lead_suggested_cnt,
       SUM(t.tot_cnt) as tot_cnt,
       COUNT(DISTINCT CASE WHEN source IN (1, 6) THEN lead_id END) as lead_suggested_cnt,
       SUM(t.dropped_cnt) as droped_cnt,
       COUNT(DISTINCT CASE WHEN source IN (1, 6) and Directory_status = 4 THEN lead_id END) as lead_droped_cnt,
       sum(t.visit_pending_cnt) visit_pending_cnt,
       COUNT(DISTINCT CASE WHEN Directory_status = 3 AND finl_status = 6 THEN lead_id END) as lead_visit_pending_cnt
FROM (SELECT (source = 1) as enquiry_cnt,
             (source = 6) as suggested_cnt,
             (source = 1 OR source = 6) as tot_cnt,
             (source IN (1, 6) AND directory_status = 4) as dropped_cnt,
             (directory_status = 3 AND finl_status = 6) as visit_pending_cnt,
            lead_id,
            timecreated
     FROM mg_lead_suggested_listing
    ) AS t
group by CAST(t.timecreated AS DATE)
order by date desc
limit 10;

摆脱子查询并在日期逻辑上使用
where
子句可能也会有所帮助。

可能有很多因素会影响查询性能(索引、记录数、关节等)。由于信息太少,要找出问题的根本原因几乎是不可能的…@Bartdude:我觉得这是导致子查询的原因,我对sql有点陌生,你能告诉我你想要什么信息吗