2015-05-09 31 views
0

我們定期向我們的訂閱者發送簡訊。我們希望刪除永不開放我們的電子郵件的用戶,也不會閱讀他們。如何簡化/改進此mysql刪除查詢

下面是我爲此所做的查詢 - 它刪除了未回覆5封電子郵件或更多郵件的訂閱者/他們的活動。

這似乎有點尷尬(而且很大!),我想知道是否有一個更簡單,更優雅/有效的方式來執行此查詢(可能與連接??),因爲它需要一段時間。

DELETE FROM list_subscriber_events where 
list_subscriber_events.subscriberid IN 
(SELECT list_subscribers.emailaddress, list_subscriber_events.subscriberid, list_subscriber_events.eventtype, count(list_subscriber_events.eventtype) as total 
FROM `list_subscriber_events` 
LEFT JOIN list_subscribers on 
list_subscriber_events.subscriberid=list_subscribers.subscriberid 
AND list_subscribers.subscriberid<>'' 
AND list_subscriber_events.subscriberid<>'' 
AND list_subscribers.subscriberid NOT IN (select subscriberid from stats_emailopens) 
AND list_subscribers.subscriberid NOT IN (select subscriberid from stats_linkclicks) 
GROUP BY list_subscriber_events.subscriberid 
HAVING count(list_subscriber_events.eventtype) > 5); 
+0

這個查詢可以工作沒有世俗的方式! subscriber_id如何在許多列中出現? – Strawberry

+0

你爲什麼要刪除用戶和事件?只需在創建電子郵件列表時過濾掉過時的地址即可。 –

+0

你可以保留一個你通過電子郵件發送給別人的單獨的表格,以及他們回覆時的數量。使用該表來驅動你的'清理'?即有兩個單獨的進程彼此並排運行。 1)當前系統假設每個人都存在。 2)一個單獨的系統試圖確認每個人都存在,並且'標記'可能'失蹤人員'。 –

回答

1

要在DELETE查詢(或幾乎任何查詢)中使用IN語句開始:IN傾向於在mysql中導致非常高的查詢執行時間。其他NOT IN語句也可能對性能不利(您必須測試不同的情況),所以這是重寫查詢以擺脫NOT IN。

此查詢的改寫可能會在下面的樣式更好:

CREATE VIEW myUsersToBeDeleted AS 
SELECT lse.subscriberid 
FROM `list_subscriber_events` lse 
LEFT JOIN list_subscribers ls ON lse.subscriberid=ls.subscriberid 
AND ls.subscriberid<>'' 
AND lse.subscriberid<>'' 
LEFT JOIN stats_emailopens se ON ls.subscriberid=se.subscriberid 
LEFT JOIN stats_linkclicks sl ON ls.subscriberid=sl.subscriberid 
WHERE sl.subscriberid IS NULL AND se.subscriberid IS NULL 
GROUP BY lse.subscriberid 
HAVING count(lse.eventtype) > 5 ; 

的DELETE是那麼容易和更快:

DELETE lse FROM list_subscriber_events lse, myUsersToBeDeleted b WHERE 
lse.subscriberid=b.subscriberid; 

最後提示:遷移到MariaDB的獲得一般方法使用視圖的性能更好。 MySQL在這個層面上相當差。

+0

謝謝諾伯特 - 這比以前更快。 – Hayek