2014-12-18 52 views
0

我們存儲客戶地址表。這些地址然後在整個系統的其他幾個表中使用,以將地址與訂單相關聯。我們希望定期移除一年內尚未使用的所有舊地址。優化刪除引用多個表

address table: 
id | address | created_at 
1 | 1234 Rd | 2011-03-12 12:45:09 
2 | 2345 Rd | 2012-04-12 13:39:19 
3 | 3456 Rd | 2012-05-12 14:33:12 
4 | 4567 Rd | 2014-12-12 15:19:54 

customer_order table: 
id | address_id | created_at 
1 | 1   | 2011-03-12 12:50:00 
2 | 2   | 2012-04-12 12:55:00 
3 | 2   | 2014-09-12 12:50:00 

group_order table: 
id | address_id | created_at 
1 | 2   | 2012-07-12 19:23:56 
2 | 3   | 2012-10-19 14:36:28 

所以我們想刪除ID爲1和3的地址,因爲它們在一年內沒有被使用過。我們將繼續地址#4,因爲它是最近創建的,和#2是在去年內使用,所以它不應該被刪除。

什麼我現在是:

DELETE FROM address WHERE created_at < DATE_SUB(NOW(), INTERVAL 365 DAY) AND id NOT IN (
    SELECT address_id FROM group_order WHERE created_at > DATE_SUB(NOW(), INTERVAL 365 DAY) 
    UNION DISTINCT 
    SELECT address_id FROM customer_order WHERE created_at > DATE_SUB(NOW(), INTERVAL 365 DAY) 
) 

然而,我的地址表包含800000+行,CUSTOMER_ORDER包含2.5M +行,group_order包含100000+行並沒有包含幾百行的另一個表,我還需要加入。因此,刪除需要很長的時間來執行(自己在約4秒返回400000+行子查詢,但刪除需要更長的時間)。

有沒有更有效的方法來做到這一點?

回答

0

我結束了使用PHP的子查詢的結果傳遞到外部查詢(取每一標識的,然後破滅NOT IN列表在外部查詢做2個獨立的查詢。

我希望MySQL的將是足夠聰明,看到子查詢不依賴於外部查詢,因此將只運行一次,並緩存結果,但我想這是從外部查詢運行的每一行的子查詢因此導致長的運行時間(〜每子查詢*4秒〜800000)。