如何高效实现两表多值匹配?SQL查询优化求助
关于高效匹配跨表记录的建议
嘿,你这个思路抓得很准!你写的JOIN语句已经是替代WHERE IN的绝佳方案了,而且在绝大多数场景下,它的效率都会比子查询版的WHERE IN更高,尤其是当两张表的数据量都比较大的时候。
先给你点个赞,你的JOIN写法本身没什么问题:
SELECT C.* FROM CARS AS C JOIN CAR_MAKES CM ON C.MODEL = CM.MODEL WHERE CM.YEAR = 2018
不过这里有个小细节需要注意:如果CAR_MAKES表中同一个MODEL对应多条2018年的记录,那么JOIN之后会返回重复的CARS记录(因为每匹配一条CAR_MAKES的记录就会带出一次CARS数据)。而原来的WHERE IN子查询是自动去重的,所以如果想要结果和原语句完全一致,建议加上DISTINCT:
SELECT DISTINCT C.* FROM CARS AS C JOIN CAR_MAKES CM ON C.MODEL = CM.MODEL WHERE CM.YEAR = 2018
另外,还有几个能进一步提升效率的小技巧:
- 加索引:一定要给
CARS.MODEL和CAR_MAKES.MODEL这两个字段建立索引,这能让JOIN的匹配过程快很多。同时给CAR_MAKES.YEAR也加个索引,过滤年份的时候数据库能更快定位到目标数据。 - 试试EXISTS子查询:另一种和JOIN效率相当的写法是用
EXISTS,它的优势是天然不会返回重复记录,不需要额外加DISTINCT,写法如下:
SELECT * FROM CARS C WHERE EXISTS ( SELECT 1 FROM CAR_MAKES CM WHERE CM.MODEL = C.MODEL AND CM.YEAR = 2018 )
数据库优化器通常会把EXISTS和JOIN优化成类似的执行计划,你可以根据自己的习惯选择。
总的来说,你的JOIN方向完全正确,只要注意去重和索引的问题,就能比原来的WHERE IN高效不少。
内容的提问来源于stack exchange,提问作者colmulhall
相关产品推荐
相关产品推荐

