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