mysql 系列文章主頁
本文將以真實例子來講解小表驅動大表(in,exists區別)
1 準備資料
1.1 建立表、函式、儲存過程
參照 這篇(呼叫函式和儲存過程批量插入資料) 文章中的第 1-7 步,注意,不要執行第8步
1.2 插入資料
現在來執行第8步。
1.2.1 向 department 表中插入 100 條記錄
call insert_dept(1000, 100)
1.2.2 向 employee 表中插入 100000 條記錄
call insert_employee(100000000, 100000);
2 測試
2.1 查詢所有 employee 資訊,要求是:employee 的 dept_id 存在於 department 表中
case#1:用 in
select*from employee where dept_id in (select id from department);
結果:在我本機測試了數十次,耗時大概是 120--130 ms
case#2:用 exists
select*from employee e where
exists (select
1from department d where e.dept_id = d.id);
結果:在我本機測試了數十次,耗時大概是 350--370 ms
2.2 查詢所有 department 資訊,要求是:至少有一條 employee 記錄的 dept_id 對應 department(或者說:此部門下至少有一條員工記錄)
case#3:用 exists
select*from department d where
exists (select
1from employee e where d.id = e.dept_id);
結果:在我本機測試了數十次,耗時大概是 4--6 ms
case#4:用 in
select*from department where id in (select dept_id from employee);
結果:在我本機測試了數十次,耗時大概是 50--55 ms
2.3 分析並總結
在 case#1,#2 中,employee 是大表,department 是小表,用 in(department) 的效果較好(大概是用 exists 時間的三分之一)====> in 後面跟小表~
在 case#3,#4 中,employee 是大表,department 是小表,用 exists(employee) 的效果較好(大概是用 in 時間的十分之一)====> exists 後面跟大表~
記憶:in 後面跟小表~exists 後面跟大表~~~因為 in 這個單詞比 exists 單詞更短(更小),exists 這個單詞比 in 更長(更大)
2.4 進一步分析
至於為什麼 case#1 優於 case#2,case#3 優於 case#4,還沒搞清楚到底是為什麼,,,,,todo
一篇文章可供參考:
3 結論
小表驅動大表
in 小 exists 大
小表驅動大表
類似迴圈巢狀。for int i 5 如果小的迴圈在外層,對於資料庫連線來說就只連線5次,進行5000次操作,如果1000在外,則需要進行1000次資料庫連線,從而浪費資源,增加消耗。這就是為什麼要小表驅動大表。在tb dept bigdata表中插入100條資料,在tb emp bigdata表中...
mysql 大表 驅動 MySQL小表驅動大表
在了解之前要先了解對應語法 in 與 exist。in後的括號的表示式結果要求先輸出一列字段。與之前的搜尋字段匹配,匹配到相同則返回對應行。mysql的執行順序是先執行子查詢,然後執行主查詢,用子查詢的結果按條匹配主查詢。exist後的括號裡則無輸出要求,exist判斷後面的結果集中有沒有行,有行則...
MySQL 小表驅動大表
小表驅動大表 準備兩站表 create table student id int 11 notnull,no varchar 20 default null name varchar 20 default null primary key id engine innodb default chars...