簡體   English   中英

MySQL與子查詢的聯合優化

[英]Mysql union optimization with subquery

我的問題是此查詢:

(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;

load_send_calc有18000條記錄,表temp 3000條記錄。 查詢本身需要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

感謝您添加解釋輸出-它告訴了我們很多。 該查詢未使用單個索引,這對性能非常不利。 一個非常簡單的優化方法是在join以及where子句中使用的字段上添加索引。 在您的情況下,這些字段為:

load_send_calc.temp_id
load_send_calc.active
temp.id_auto

除此之外,您還有不必要的AND TEMP_ID > 0 ,因為您已經使用WHERE TEMP_ID LIKE '$find%'限制同一字段

加快速度的3件事:

INDEX(active, temp_id) -- significantly better than two separate indexes

IN ( SELECT ... )性能較差,尤其是在舊版本的MySQL中。 把它變成一個JOIN

為每個SELECT添加一個LIMIT 例如:

( SELECT ... ORDER BY ... LIMIT 80 )
UNION ALL
( SELECT ... ORDER BY ... LIMIT 80 )
             ORDER BY ... LIMIT 70, 10;

內部的有所需的最大限制-外部的偏移量+限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM