SELECT
        t1.device_id 
    FROM
        t_device t1 
    INNER JOIN
        t_online t3 
            ON t1.device_id=t3.device_id 
    LEFT JOIN
        (
            SELECT
                s.device_id,
                s.avg_tdc 
            FROM
                t_site_houravg_tdc s
            WHERE
                s.create_time > DATE_ADD( NOW( ), INTERVAL - 1 HOUR ) 
        ) AS t2 
            ON t1.device_id = t2.device_id 
    WHERE
        t1.customer_id = '1' 
        AND t1.`status` = 1 
        AND t1.type_id = 1539730699168001 
        AND (
            t2.avg_tdc > 9980 
            OR t2.avg_tdc IS NULL
        )

解决方案 »

  1.   

    不知道你表里的数据量、数据类型、索引情况。大致也就只能改成这样了。
    SELECT
             t1.device_id 
         FROM
             t_device t1 
         INNER JOIN
             t_online t3 
                 ON t3.device_id=t1.device_id 
         LEFT JOIN
             t_site_houravg_tdc t2 
                 ON t2.device_id = t1.device_id and t2.create_time > DATE_ADD( NOW( ), INTERVAL - 1 HOUR ) 
         WHERE
             t1.customer_id = '1' 
             AND t1.`status` = 1 
             AND t1.type_id = 1539730699168001 
             AND (
                 t2.avg_tdc > 9980 
                 OR t2.avg_tdc IS NULL
             )
      

  2.   

    t2 是临时表 么有索引,当然慢了。可以用新版本mysql。 或不用left join,或再优化。