mysql的理論依據沒找到,個人理解是先執行where的過濾條件,先關聯再過濾明顯做的是無用功。
oracle中倒是能在執行計劃中看到,先執行的是過濾條件(下面代碼中最后一行)。
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')