SELECT 쿼리 작성 시 *
는 상당히 편한 기능 중 하나입니다.
해당 레코드의 모든 칼럼의 데이터를 조회할수 있습니다.
그래서 취준생 시절 학습 단계에서는 SELECT 쿼리 작성 시 상당히 많이 사용했었습니다.
하지만 취업 후 게임 서버 업무를 진행하면서 *
보다는 직접 칼럼을 명시하는게 안전 하다는 것을 알게되었습니다.
더 큰 문제들이 있겠지만 이렇게 3가지 정도만 정리를 해봤습니다.
위 내용은 다른 블로그를 보거나 chatGPT에 물어보면 쉽게 나오는 내용입니다.
단순히 이론적인 부분이 아닌 *
의 문제점을 직접 확인해볼 방법을 찾아봤습니다.
1053개 정도의 더미 데이터가 들어이는 PostBox(우편함) 테이블을 기준으로 테스트 해봤습니다.
(아래 실행 된 쿼리의 실행계획은 각 환경, DB 설계에 따라 다를 수 있습니다. 참고만 부탁드립니다.)
EXPLAIN SELECT * FROM PostBox;
실행 계획을 보면 type
에 ALL
이 적혀 있기 때문에 풀 스캔을 한다는 것을 알 수 있습니다.
당연히 전체 조회를 하는 쿼리이기 때문에 풀 스캔을 한다고 생각할 수 있습니다.
하지만 쿼리문에 인덱스 칼럼을 명시 하면 실행계획에 다른 결과가 나오게 됩니다.
EXPLAIN SELECT Id FROM PostBox;
인덱스 칼럼인 Id를 명시 한 결과 type
에 index
가 적혀있고, Extra
에 Using index
가 출력되게됩니다.
Using index
가 표시되면 커버링 인덱스가 적용된 것입니다.EXPLAIN SELECT Id, Username FROM PostBox;
하지만 쿼리에 인덱스가 아닌 칼럼 Username
을 추가하면 type이 ALL로 출력되게됩니다.
반대로 인덱스 칼럼만 추가를 하면 인덱스를 타게 됩니다.
EXLAIN SELECT * FROM PostBox WHERE Id > 500;
*
을 사용하면 테이블을 풀 스캔 할 확률이 올라간다.*
을 사용한다고 무조건 테이블을 풀 스캔 하는 것은 아니다.*
을 사용한다고 해도 WHERE 절에 Index 칼럼의 적절한 범위를 SELECT하면 쿼리 성능 저하를 피할 수 있다.