SQL中JOIN与WHERE执行次序及优化问题 2018-05-23 14:24:43 我们有表A: | id | data | | --- | --- | | 1 | a | | 1 | b | | 2 | c | 表B: | id | data | | --- | --- | | 1 | a2 | | 2 | c2 | 对于以下SQL: ```sql SELECT A.id, A.data, B.data FROM A LEFT JOIN B ON A.id = B.id WHERE B.id = 1 ``` 执行结果为: | id | data | data | | --- | --- | --- | | 1 | a | a2 | | 1 | b | a2 | 对于这条语句是先执行JOIN,在执行WHERE。 如果我们想先执行WHERE在执行JOIN,就需要将SQL调整为: ```sql SELECT A.id, A.data, B.data FROM A LEFT JOIN (SELECT * FROM B WHERE id=1) B ON A.id = B.id ``` 执行结果为: | id | data | data | | --- | --- | --- | | 1 | a | a2 | | 1 | b | a2 | | 2 | c | null | 从执行结果对比可见,对于LEFT JOIN和WHERE的执行次序会影响最终结果。 ## 优化问题 对于小表LEFT JOIN大表的情况,如果先JOIN在执行WHERE,由于JOIN是全表进行的,JOIN完在执行WHERE,虽然最终结果不会太大,但是由于右表的数据量较大,实际的计算消耗还是很高。 如果我们先对大表的数据做些过滤,保留我们关心的数据,在做JOIN,会减少JOIN的计算消耗,可以提高语句的执行速度(当然,这还取决于过滤后右表数据的多少)。 先做WHERE在执行LEFT JOIN的情况,会保留左表的所有数据,如果我们只关心关联上的数据,则可以采用INNER JOIN的方式。 非特殊说明,均为原创,原创文章,未经允许谢绝转载。 原始链接:SQL中JOIN与WHERE执行次序及优化问题 赏 Prev HDFS新增JournalNode节点 Next Phabricator配置WebHook实现代码变更的自动处理