상세 컨텐츠

본문 제목

mysql 조건에서 in 절에는 몇 개까지 넣을 수 있을까?

IT/DB

by JR 2026. 1. 14. 14:38

본문

300x250
반응형

 

 

 

✅ 결론부터

MySQL에서 IN (...) 절에 “개수 제한”은 없다.
❗ 하지만 실질적인 한계는 존재하고, 보통 수천 개부터 성능 문제가 발생한다.


1️⃣ MySQL 공식적인 제한은?

❌ 없음

WHERE col IN (값1, 값2, 값3, ...);
  • MySQL은 IN 절 값 개수에 대한 명시적 제한을 두지 않음
  • 이론적으로는 수만 개도 가능

2️⃣ 그런데 왜 “제한이 있다”고들 말할까?

🔥 실제 한계는 여기서 생김

① SQL 패킷 크기 제한

  • 변수: max_allowed_packet
  • 기본값: 64MB (환경에 따라 다름)
SHOW VARIABLES LIKE 'max_allowed_packet';

👉 IN 값이 너무 많으면

ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet'

② 파싱 & 실행 계획 비용

  • IN 리스트가 길어질수록
    • SQL 파싱 시간 증가
    • 옵티마이저 부담 증가
    • 쿼리 캐시 활용 불가

📌 수천 개 넘어가면 체감 성능 저하


③ 인덱스 사용 비효율

WHERE user_id IN (1, 2, 3, ..., 5000)
  • MySQL은 내부적으로
    • 여러 번의 OR 조건처럼 처리하거나
    • 임시 구조 생성
  • 값이 많아질수록 랜덤 I/O 증가

3️⃣ 실무 기준 권장 개수 (경험치)

IN 값 개수 평가
~100 👍 문제 없음
~500 👍 대부분 OK
~1,000 ⚠️ 주의
~3,000 ❌ 비추천
10,000+ 🚨 거의 재앙

👉 **“천 개 넘어가면 설계 다시 보자”**가 실무 룰입니다.


4️⃣ 대안 방법 (중요 ⭐)

✅ 1. 임시 테이블 / 조인 (최고 추천)

SELECT t.*
FROM target_table t
JOIN temp_ids i ON t.id = i.id;

📌 장점

  • 인덱스 사용 가능
  • 실행계획 안정
  • 대용량에서도 빠름

✅ 2. 서브쿼리 사용

SELECT *
FROM orders
WHERE user_id IN (
    SELECT user_id
    FROM user_list
);

👉 값이 테이블로 관리될 때는 이게 훨씬 낫습니다.


✅ 3. JSON / 문자열 IN (비추천)

WHERE FIND_IN_SET(col, '1,2,3,4')

❌ 인덱스 못 씀
❌ 성능 최악


5️⃣ DB별 비교 (참고)

DB IN 제한
MySQL 제한 없음 (현실적 한계 있음)
Oracle 1,000개 제한 🚨
PostgreSQL 제한 없음
SQL Server 제한 없음

👉 Oracle 쓰다가 MySQL 오면 헷갈리는 포인트


📌 실무 한 줄 요약

MySQL IN 절은 제한은 없지만
1,000개 넘으면 구조를 바꿔라.

→ 임시 테이블 + JOIN이 정답


 

 

300x250
반응형

관련글 더보기