MySQL查看兩個查詢的差集


目前我知道有兩個辦法,一個是not in, 另外一個是left join

大部分情況下,left join的效率比較高

1. 使用 not in 函數

EXPLAIN SELECT
	count(*) 
FROM
	( SELECT id FROM arg_approve WHERE create_time > '2020-08-13 00:00:00' ) a 
WHERE
	a.id NOT IN (
	SELECT
		approve_id 
	FROM
	arg_approve_query)

查看執行計划:

2. 使用left join

EXPLAIN SELECT
	a.session_hash,
	a.create_time,
	b.approve_id 
FROM
	( SELECT id, session_hash, create_time FROM arg_approve WHERE create_time > '2020-08-14 00:00:00' ) a
	LEFT JOIN arg_approve_query b ON a.id = b.approve_id 
WHERE
	approve_id IS NULL

查看執行計划:

3. 分析

首先可以看這篇文章構建一下基礎
https://www.cnblogs.com/kongzhongqijing/articles/3544020.html

分析我們的執行計划,主要看索引類型和rows,使用left join的索引是ref,而not in使用的index。rows列很明顯,外層掃描的rows行數,left join明顯優於not in。

索引類型的效率關系:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

所以使用left join會比not in更加有效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM