[英]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.