在了解之前要先了解對應語法 in 與 exist。
in後的括號的表示式結果要求先輸出一列字段。與之前的搜尋字段匹配,匹配到相同則返回對應行。
mysql的執行順序是先執行子查詢,然後執行主查詢,用子查詢的結果按條匹配主查詢。
exist後的括號裡則無輸出要求,exist判斷後面的結果集中有沒有行,有行則返回外層查詢對應的行。
ps所以exist還可以這樣寫: 用常量替換* ,反正是判斷有沒有行,不需要實際傳回的資料。
select * from a where exist(select 1 from b where b.id= a.id)
mysql的執行順序是先執行主查詢,將主查詢的資料放在子查詢中做條件驗證。
大體看來貌似exist的執行效率比in低,但其實exists子查詢在底層做了優化,會忽略select清單,也並不會對每條資料進行對比。
比如這裡有兩張表
在查詢中最好使用小表驅動大表,因為在外層表迴圈內層的時候,會鎖定外層表,如果大表在外,會鎖定5k次 。
如果要求查詢所有id相同的aname 有兩種查詢方式
1.由b表驅動a表 會先執行子查詢 大表驅動小表
2.由a表驅動b表 會先執行主查詢 小表驅動大表
如果需求變為 查詢所有id相同的bname
1.小表驅動大表
2.大表驅動小表
小表驅動大表
1. 驅動表的定義
當進行多表連線查詢時, [驅動表] 的定義為:
1)指定了過濾條件時,滿足查詢條件的記錄行數少的表為[驅動表]
2)未指定過濾條件時,行數少的表為[驅動表](important!)
2. 為何要 小表驅動大表??
通常來講,不管oracle還是mysql,優化的目標都是盡可能的減少關聯的 迴圈次數,保證小表驅動大表
例: user表10000條資料,class表20條資料
select * from user u left join class c u.userid=c.userid
這樣則需要用user表迴圈10000次才能查詢出來,而如果用class表驅動user表則只需要迴圈20次就能查詢出來
分析:不管大表是驅動表還是小表是驅動表,比較次數永遠是10000*20次啊???
小表驅動大表優勢在哪???
優勢在於: 1. 大表具有索引:查詢大表時間是o(log n)
2. 大表全表掃瞄:磁碟塊查詢速度快
了解mysql聯表查詢中的驅動表,優化查詢,以小表驅動大表
為什麼要用小表驅動大表
1、驅動表的定義
當進行多表連線查詢時, [驅動表] 的定義為:
1)指定了聯接條件時,滿足查詢條件的記錄行數少的表為[驅動表]
2)未指定聯接條件時,行數少的表為[驅動表](important!)
忠告:如果你搞不清楚該讓誰做驅動表、誰 join 誰,請讓 mysql 執行時自行判斷
既然「未指定聯接條件時,行數少的表為[驅動表]」了,而且你也對自己寫出的複雜的 nested loop join 不太有把握(如下面的例項所示),就別指定誰 left/right join 誰了,請交給 mysql優化器 執行時決定吧。
如果您對自己特別有信心
2、mysql關聯查詢的概念:
mysql 表關聯的演算法是 nest loop join,是通過驅動表的結果集作為迴圈基礎資料,然後一條一條地通過該結果集中的資料作為過濾條件到下乙個表中查詢資料,然後合併結果。
例: user表10000條資料,class表20條資料
select * from user u left join class c u.userid=c.userid
這樣則需要用user表迴圈10000次才能查詢出來,而如果用class表驅動user表則只需要迴圈20次就能查詢出來
例:select * from class c left join user u c.userid=u.userid
小結果集驅動大結果集
de.cel 在2023年總結說,不管是你,還是 mysql,優化的目標是盡可能減少join中nested loop的迴圈次數。
以此保證:永遠用小結果集驅動大結果集(important)!
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...
MySQL高階知識 小表驅動大表
當b表的資料集必須小於a表的資料集時,用in優於exists select from a where id in select id from b 當a表的資料集小於b表的資料集時,用exists優於in select from a where exists select 1 from b wher...
小表驅動大表
類似迴圈巢狀。for int i 5 如果小的迴圈在外層,對於資料庫連線來說就只連線5次,進行5000次操作,如果1000在外,則需要進行1000次資料庫連線,從而浪費資源,增加消耗。這就是為什麼要小表驅動大表。在tb dept bigdata表中插入100條資料,在tb emp bigdata表中...