繁体   English   中英

如何加快我的MySQL查询(JOINs + GROUP BY)

[英]How can I speed up my MySQL query (JOINs + GROUP BY)

我在mysql中有此查询,由于要花近20秒钟才能执行,因此我想对有限制的innerjoins进行选择,以使执行速度更快。

SELECT t1.order_id, CONCAT(t3.first_name,' ',t3.last_name),
    buyer_first_name, buyer_last_name, 
    max(product_quantity) as product_quantity, order_status, 
    order_value, t5.first_name staff_firstnamelogin, 
    t5.last_name staff_lastnamelogin, t6.day_name

FROM t_seller_order t0

INNER JOIN t_orders t1
                ON t0.event_id = t1.event_id 
               AND t1.seller_order_token = t0.seller_order_token

INNER JOIN t_tickets t2
                ON t1.order_id = t2.order_id

INNER JOIN t_login t3
                ON t3.login_id = t1.login_id

INNER JOIN t_login t5
                ON t0.login_id = t5.login_id

INNER JOIN t_event_days t6
                ON t2.product_id = t6.event_day_id

WHERE t0.event_id = 35

group by t1.order_id

order by order_id desc;

关于架构的许多事情阻碍了查询的速度。 让我们看看可以做什么或不能做什么...

由于WHEREGROUP BY命中了不同的表,因此没有索引对两者都有用。 最好是拥有t0INDEX(event_id)

JOIN的索引:t2..t6需要对order_idlogin_idevent_day_id索引(或PK)。 t1 INDEX(event_id, seller_order_token)序都需要INDEX(event_id, seller_order_token)

GROUP BYORDER BY是“相同”的,因此将只采用一种,而不是两种。

一个潜在的加速方法是执行一些JOINs 之前完成GROUP BY 当前结构是“ inflate-deflate”,其中JOINs共同创建一个巨大的临时表,然后GROUP BY扩展结果。 所以...

如果看是否可以编写这样的SELECT

SELECT t0.id, t1.id  -- I need the PRIMARY KEYs for these two tables
    FROM t_seller_order AS t0
    JOIN t_orders       AS t1
    WHERE t0.event_id = 35
    GROUP BY t1.order_id

那有多快? 希望我们可以围绕此构建其余的查询,但不会花费太多时间。 有两种方法: 我不知道哪个会更好。

计划A:请尽可能使用子查询,而不要使用JOINs 例如,不要将JOINing to t3, plan on this being one item in the ,而是将JOINing to t3, plan on this being one item in the SELECT` JOINing to t3, plan on this being one item in the一项:

    ( SELECT CONCAT(first_name,' ',last_name)
          FROM t_login WHERE login_id = t1.login_id
    ) AS login_name

(Ditto用于SELECT中仅接触表一次的任何其他列。就目前而言,t5接触了两次,因此这种方法可能不切实际。)

方案B: GROUP BY 之后 JOIN 也就是说,之后“放气”。

SELECT ...
    FROM ( SELECT t0.id, t1.id ... GROUP BY... ) AS x -- as discussed above
    JOIN y  ON y.foo = x.foo
    JOIN z  ON z.bar = x.bar
    -- the GROUP BY is avoided
    ORDER BY x.order_id desc;   -- The ORDER BY is still necessary

举个例子,我倾向于B计划,但是可能需要同时使用这两个“计划”。

进一步说明: LEFT JOINLIMIT在上面的讨论中增加了皱纹。 由于您都没有,因此我不会与他们进行混乱的讨论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM