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+行子查詢,但刪除需要更長的時間)。
有沒有更有效的方法來做到這一點?