簡體   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