程式狂想筆記

一個攻城師奮鬥史

0%

大量A表排除特定B表 id 排除方法小記

最近需求需要A表過濾B表
但是資料量非常大
處理時間非常久

刪除方法得到結果

1
2
3
4
5
6
7
8
9
SELECT id FROM A  LEFT JOIN B ON A.id = B.id WHERE B.id is null 
-- 執行非常久
-- 後來想嘗試用刪除資料看看結果,資料表都是暫時的

DELETE FROM A WHERE A.id IN (SELECT id FROM B)
-- 執行非常久

DELETE a FROM A a INNER JOIN B b ON a.id = b.id
-- 執行非常快

之前有紀錄SQL UPDATE 和 DELETE 趴配 JOIN 方法 | 程式狂想筆記

最後我使用上面方式解決這個方法

使用 NOT EXISTS

其實以前就有聽過 EXISTS 效能是不錯的
剛好爬文看到LEFT JOIN / IS NULL vs. NOT IN vs. NOT EXISTS: nullable columns at EXPLAIN EXTENDED
看到使用 NOT EXISTS 還滿不錯的
但是做 count(distinct) 還是很慢
group by 也不快

1
SELECT id FROM A  LEFT JOIN B ON A.id = B.id WHERE B.id is null

又空想到好的方式在做筆記

可以在探討方法

pandas

Python之使用Pandas庫實現MySQL資料庫的讀寫 | 程式前沿
Pandas 加载数据的I/O性能比较 - This is Robert Lexis.
[Pandas]一个Pandas VS MySQL SQL 的性能对比 - FlyML

SQL

LEFT JOIN / IS NULL vs. NOT IN vs. NOT EXISTS: nullable columns at EXPLAIN EXTENDED
SQL好文分享 - 十步完全理解 SQL | 程式狂想筆記
經典:十步完全理解 SQL-知識星球

2020-03-05

通過使用EXISTS,Oracle會首先檢查主查詢,然後執行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle在執行IN子查詢時,首先執行子查詢,並將獲得的結果列表存放在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。這也就是使用EXISTS比使用IN通常查詢速度快的原因

SQL中EXISTS與IN的效率問題 - IT閱讀

通常 exists 子查詢是查到有資料才會出來
這邊要特別注意