네, SELECT 1과 함께 LIMIT 1을 사용할 수 있으며, 대용량 테이블에서는 오히려 권장되는 방식입니다. 두 쿼리의 동작 차이와 실제 실행 예제를 통해 자세히 살펴보겠습니다.
SELECT 1의 기본 동작
SELECT 1 FROM 테이블명;은 테이블의 모든 행마다 상수 값 1을 반환합니다. 만약 테이블에 수십억 개의 레코드가 있다면, 결과 집합에도 1이 그만큼 반복해서 출력됩니다.
SELECT 1 FROM yourTableName;
LIMIT 1을 추가하면 어떻게 될까?
LIMIT 1을 붙이면 MySQL은 첫 번째 행만 읽고 즉시 스캔을 중단합니다. 따라서 결과로 1이 단 한 번만 출력되며, 불필요한 행 스캔이 줄어들어 성능상 이점도 얻을 수 있습니다.
SELECT 1 FROM yourTableName LIMIT 1;
실습 예제
위 구문을 이해하기 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table Select1AndLimit1Demo -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Name varchar(20) -> ); Query OK, 0 rows affected (1.99 sec)
INSERT 명령으로 샘플 데이터를 삽입합니다.
mysql> insert into Select1AndLimit1Demo(Name) values('John');
Query OK, 1 row affected (0.21 sec)
mysql> insert into Select1AndLimit1Demo(Name) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into Select1AndLimit1Demo(Name) values('Sam');
Query OK, 1 row affected (0.11 sec)
mysql> insert into Select1AndLimit1Demo(Name) values('Bob');
Query OK, 1 row affected (0.18 sec)
mysql> insert into Select1AndLimit1Demo(Name) values('David');
Query OK, 1 row affected (0.14 sec)
mysql> insert into Select1AndLimit1Demo(Name) values('Mike');
Query OK, 1 row affected (0.20 sec)
mysql> insert into Select1AndLimit1Demo(Name) values('Maxwell');
Query OK, 1 row affected (0.11 sec)
SELECT 문으로 전체 레코드를 확인합니다.
mysql> select *from Select1AndLimit1Demo;
출력 결과
+----+---------+ | Id | Name | +----+---------+ | 1 | John | | 2 | Carol | | 3 | Sam | | 4 | Bob | | 5 | David | | 6 | Mike | | 7 | Maxwell | +----+---------+ 7 rows in set (0.00 sec)
SELECT 1 실행 결과
mysql> select 1 from Select1AndLimit1Demo;
+---+ | 1 | +---+ | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | +---+ 7 rows in set (0.00 sec)
테이블에 7개의 레코드가 있으므로 1이 일곱 번 출력됩니다.
SELECT 1 ... LIMIT 1 실행 결과
mysql> select 1 from Select1AndLimit1Demo limit 1;
+---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec)
동일한 테이블에서 LIMIT 1을 사용했기 때문에 1이 한 번만 출력됩니다.
정리
레코드가 몇 개 되지 않는 소규모 테이블이라면 두 쿼리의 차이를 체감하기 어렵습니다. 하지만 수백만~수십억 건의 데이터가 있는 테이블이라면 LIMIT 절은 MySQL이 조건을 만족하는 즉시 스캔을 중단하도록 하여 서버 자원과 처리 시간을 크게 절약해 줍니다. 특히 레코드 존재 여부를 확인하는 EXISTS 검사나 임계값 체크 같은 상황에서는 LIMIT 1을 함께 사용하는 것이 좋은 습관입니다.