2017-05-03 146 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