繁体   English   中英

想优化mysql查询

[英]Want to optimize mysql query

我正在寻找有关优化此mysql查询的帮助。 运行时间超长,因为main_activity下的两个表都非常大(每个表都超过1000万行!)。 main_db.members和main_db.customers分别约为400K和600K行。

编辑:

基于使用临时表的建议,只想补充一点,我正在只读数据库上运行查询,因此临时表可能是个问题。 在不使用临时表的情况下可以做哪些优化?

select distinct
    a.members_id,
    a.customer_id,
    a.subscription,
    a.buy_date,
    from_unixtime((max(m2.sales_date) / 1000), '%m/%d/%Y')  as sales_date,
    a.return_date,
    a.signup_date,
    from_unixtime((max(st.visit_date) / 1000), '%m/%d/%Y') as visit_date
from (select distinct
          m1.members_id,
          m1.customer_id,
          m1.subscription,
          from_unixtime((m1.buy_date / 1000), '%m/%d/%Y') as buy_date,
          from_unixtime((m1.return_date / 1000), '%m/%d/%Y')   as return_date,
          from_unixtime((c.signup_date / 1000), '%m/%d/%Y')   as signup_date
      from main_db.members m1
          join main_db.customer c on c.global_members_id = m1.members_id
     ) as a
    left join main_db.members m2 on m2.customer_id = a.customer_id
    left join main_activity.onlinevisit s on s.customer_id = a.customer_id
    left join main_activity.storevisit st on st.visit_id = s.visit_id

这个想法是用一个好的键创建一个临时表。 我们可以从这里开始:

create temporary table a (key(customer_id)) select distinct
          m1.members_id,
          m1.customer_id,
          m1.subscription,
          from_unixtime((m1.buy_date / 1000), '%m/%d/%Y') as buy_date,
          from_unixtime((m1.return_date / 1000), '%m/%d/%Y')   as return_date,
          from_unixtime((c.signup_date / 1000), '%m/%d/%Y')   as signup_date
      from main_db.members m1
          join main_db.customer c on c.global_members_id = m1.members_id;


select distinct
    a.members_id,
    a.customer_id,
    a.subscription,
    a.buy_date,
    from_unixtime((max(m2.sales_date) / 1000), '%m/%d/%Y')  as sales_date,
    a.return_date,
    a.signup_date,
    from_unixtime((max(st.visit_date) / 1000), '%m/%d/%Y') as visit_date
from a
    left join main_db.members m2 on m2.customer_id = a.customer_id
    left join main_activity.onlinevisit s on s.customer_id = a.customer_id
    left join main_activity.storevisit st on st.visit_id = s.visit_id;

您还需要确保在其他表中也具有正确的键。

请提供SHOW CREATE TABLE

我希望有索引

m2.customer_id
s.customer_id
st.visit_id

如果没有,那可能是一个严重的性能问题。

使用DISTINCT意味着JOINs将行数相乘,您需要缩小它。 没有DISTINCT每个查询都可以吗? 消除它可以节省对数据的传递。

避免通货紧缩的另一种可能性是更换

max(m2.sales_date)

( SELECT max(m2.sales_date)
      FROM main_db.members m2
      WHERE m2.customer_id = a.customer_id )

(等等)

暂无
暂无

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

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