MySQL에서 JOIN 쿼리를 작성했을 때 에러 없이 결과는 나오는데,
이때 원인으로 생각해볼 수 있는 것이 조인 키 타입 불일치입니다.
users.user_id -- VARCHAR
orders.user_id -- INT
SELECT *
FROM users u
INNER JOIN orders o
ON u.user_id = o.user_id;
문법상 문제는 없고, 실제로도 결과는 나옵니다.
그래서 문제를 바로 인지하기 어렵습니다.
문자열과 숫자를 비교하면
MySQL은 한쪽을 암묵적으로 형변환합니다.
값이 같아서 JOIN된 것이 아니라,
암묵적 형변환에 의해 비교된 결과에 가깝습니다.
이 과정에서
조인 키 중 한쪽에서 형변환이 발생하면
해당 컬럼의 인덱스는 사용되지 않습니다.
EXPLAIN
SELECT *
FROM users u
INNER JOIN orders o
ON u.user_id = o.user_id;
이 경우 인덱스가 있어도 Full Scan이 발생해 쿼리 성능에 영향을 줄 수 있습니다.
✔️에러 없이 동작하는 JOIN이라도,
조인 키 타입이 다르면 예상과 다른 결과나 비효율이 발생할 수 있습니다.