MySQL与子查询的联合优化

雷德里夫

我的问题是此查询:

(SELECT    
     ID1,ID2,ID3,ID4,ID5,ID10,ID11,ID13,ID14,ID454,ID453,
     TIME,TEMP_ID,'ID_AUTO',PREDAJCA,VYTVORIL,MAIL,TEMP_ID_HASH,ID_SEND 
   FROM `load_send_calc` 
   WHERE `TEMP_ID` LIKE '$find%' 
     AND ACTIVE = 1 AND TEMP_ID > 0)
UNION ALL
(SELECT 
     ID1,ID2,ID3,ID4,ID5,ID10,ID11,ID13,ID14,ID454,ID453,TIME,'',
     ID_AUTO,'','','','','' 
  FROM `temp` 
  WHERE `ID_AUTO` LIKE '$find%' 
    AND `ID_AUTO` NOT IN (SELECT TEMP_ID 
                            FROM `load_send_calc` 
                            WHERE `load_send_calc`.ACTIVE = 1)
)
ORDER BY TIME  DESC LIMIT $limitFrom,$limitTo;

表中有18000条记录,表中有load_send_calc3000条记录temp查询本身需要超过2分钟的时间来执行。有什么办法可以优化这段时间吗?

我已经尝试将顺序放入每个子查询中,但是并没有明显帮助。我真的很拼命,所以我非常感谢任何帮助。

编辑:这是解释结果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY load_send_calc  ALL NULL    NULL    NULL    NULL    18394   Using where
2   UNION   temp    ALL NULL    NULL    NULL    NULL    1918    Using where
3   DEPENDENT SUBQUERY  load_send_calc  ALL NULL    NULL    NULL    NULL    18394   Using where
NULL    UNION RESULT    <union1,2>  ALL NULL    NULL    NULL    NULL    NULL    Using filesort
帕拉

感谢您添加您的解释输出-它告诉了我们很多。该查询未使用单个索引,这对性能非常不利。一个非常简单的优化方法是在joinwhere子句中使用的字段上添加索引在您的情况下,这些字段为:

load_send_calc.temp_id
load_send_calc.active
temp.id_auto

除此之外,您还没有必要使用AND TEMP_ID > 0,因为您已经限制了与WHERE TEMP_ID LIKE '$find%'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章