新人一枚,求大神分析下exists 和in。本人自己測驗,建了兩張表:employee 1000萬條資料; employee_department 14條資料。
-- 外表大的情況
explain select t1.* from employee t1
where t1.id in (select employee_id from employee_department);
查詢(1)耗時:0.002s
explain select t1.* from employee t1 where exists (
select 1 from employee_department where employee_id = t1.id
);
查詢(2)耗時:23s
這個查看執行計劃明白。但是內表大的情況,就糾結了:
-- 內表大的情況
select t1.* from employee_department t1 where t1.employee_id in (
select id from employee
)
查詢(3):0.001s
select t1.* from employee_department t1 where exists (
select 1 from employee where id = t1.employee_id
)
查詢(4):0.001s
和網上主流說法,內表大的情況,使用exists表示看不明白。環境MySql 5.7
uj5u.com熱心網友回復:
內表大的時候用exist,是因為只用遍歷外表的資料但是in是在記憶體中查詢,所以exist跟in的時間差不多也是可能發生的。
uj5u.com熱心網友回復:
針對(3)select id from employee,單獨執行的話,需要4秒左右,但是全查詢的話(3)只要0.001秒。這點不明白SQL執行的邏輯,希望大神解釋下 @二樓
uj5u.com熱心網友回復:
explain列印看看uj5u.com熱心網友回復:
5.7 不記得是那個版本開始, in 有時候會被自動優化為 exists 執行,所以驗證一下執行計劃吧uj5u.com熱心網友回復:
就看一下執行計劃uj5u.com熱心網友回復:
試試這個SELECT
t1.*
FROM
employee t1
JOIN employee_department t2
ON t2.employee_id = t1.id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/78266.html
標籤:MySQL
上一篇:父子關系串列 按創建時間排序
