2017-05-03 195 views
-3

我有以下查詢:的MySQL查詢花費過多時間

SELECT t.t_id 
    , t.usr_idx 
    , t.t_is_for 
    , t.tg_ids 
    , t.created_time 
    , t.allow_reply 
    , u.usr_name 
    , u.usr_avatar 
    , u.show_profile 
    , IF(u.usr_timeline != '',CONCAT('https://s3.amazonaws.com/tuurnts3thumbnail/',u.usr_timeline),'') as usr_timeline 
    , u.node_userid 
    , t.t_time 
    FROM tuu_tuurnt t 
    JOIN tuu_user u 
    ON t.usr_idx = u.usr_idx 
    AND u.usr_state = 1 
    LEFT 
    JOIN tuu_post p 
    ON t.t_id = p.t_id 
    AND p.usr_idx = 44756 
    LEFT 
    JOIN tuu_friend f 
    ON f.frd_my_idx = 44756 
    AND f.frd_your_idx = t.usr_idx 
    LEFT 
    JOIN tuu_friend fl 
    ON fl.frd_your_idx = 44756 
    AND fl.frd_my_idx = t.usr_idx 
WHERE t.status = 0 
    AND NOT EXISTS (SELECT b.tuu_b_by_usr_idx 
         FROM tuu_blocked as b 
        WHERE b.tuu_b_usr_idx = 44756 
         AND t.usr_idx = b.tuu_b_by_usr_idx 
       )  
GROUP 
    BY t.t_id  
ORDER 
    BY t.t_time DESC 
    , t.t_id DESC  
LIMIT 0,30; 

它需要近7-8秒給結果,但是當我通過t.t_time刪除訂單,t.t_id那麼它在1運行秒以下

有什麼我做錯了嗎?

+1

花費一些努力來格式化您的查詢。 –

+0

在沒有任何聚合函數的情況下,包含GROUP BY子句通常是一個肯定的信號,表示您不知道自己在做什麼。你在做什麼?爲了回答,請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very- simple-sql-query – Strawberry

+0

請在您的問題中添加'EXPLAIN'結果。它會指示MySQL實際決定用於ORDER BY子句的索引。 – Alexander

回答

0

沒有索引,MySQL必須從第一行開始,然後通讀整個表以找到相關的行。表格越大,成本越高。詳情請參閱How MySQL Uses Indexes。另請參閱this topic關於一起使用索引和別名。

+0

感謝您的回覆,正如您所看到的按時間順序排列的t_time。這已經被索引了。如果我只在一秒內完成作品的訂單。 – uks