最近需求需要A表過濾B表
但是資料量非常大
處理時間非常久
刪除方法得到結果
1 | SELECT id FROM A LEFT JOIN B ON A.id = B.id WHERE B.id is null |
之前有紀錄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通常查詢速度快的原因
通常 exists 子查詢是查到有資料才會出來
這邊要特別注意