鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)/ 關(guān)于mysql聯(lián)表的內(nèi)嵌循環(huán)操作nested loop join中on和wher

關(guān)于mysql聯(lián)表的內(nèi)嵌循環(huán)操作nested loop join中on和where執(zhí)行順序問(wèn)題

譬如語(yǔ)句
select * from table_a join table_b on table_a.id=table_b.a_id and table_a.name='smith' join table_c where table_a.priority=3 and table_b.seq=8 and table_c.sales=1998;

在聯(lián)表內(nèi)嵌循環(huán)操作中,假如table_a是驅(qū)動(dòng)表

1) table_a 根據(jù)on條件中的table_a.name='smith'過(guò)濾后的結(jié)果集做第一層循環(huán)集,依次類推,等到a,b,c聯(lián)表后生成的臨時(shí)表再針對(duì)where語(yǔ)句中的條件進(jìn)行過(guò)濾
2) table_a 根據(jù)on條件中的table_a.name='smith'以及where條件中的table_a.priority=3過(guò)濾后的結(jié)果集第一層循環(huán)集,依次類推

其實(shí)就是理解on和where的執(zhí)行順序
哪種是對(duì)的?

回答
編輯回答
落殤

mysql的理論依據(jù)沒(méi)找到,個(gè)人理解是先執(zhí)行where的過(guò)濾條件,先關(guān)聯(lián)再過(guò)濾明顯做的是無(wú)用功。

oracle中倒是能在執(zhí)行計(jì)劃中看到,先執(zhí)行的是過(guò)濾條件(下面代碼中最后一行)。

explain plan for SELECT * FROM tmp_t2 t2 LEFT JOIN tmp_t1  t1 ON t2.id = t1.id AND t1.good_id = 'A'

-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     3 |   147 |     6   (0)| 00:00:01 |
|*  1 |  HASH JOIN         |        |     3 |   147 |     6   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| TMP_T2 |     3 |    60 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| TMP_T1 |     3 |    87 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("T2"."ID"="T1"."ID")
   3 - filter("T1"."GOOD_ID"='A')
2018年1月18日 03:02