MySQL에서 IN (...) 절에 “개수 제한”은 없다.
❗ 하지만 실질적인 한계는 존재하고, 보통 수천 개부터 성능 문제가 발생한다.
WHERE col IN (값1, 값2, 값3, ...);
SHOW VARIABLES LIKE 'max_allowed_packet';
👉 IN 값이 너무 많으면
ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet'
📌 수천 개 넘어가면 체감 성능 저하
WHERE user_id IN (1, 2, 3, ..., 5000)
| IN 값 개수 | 평가 |
| ~100 | 👍 문제 없음 |
| ~500 | 👍 대부분 OK |
| ~1,000 | ⚠️ 주의 |
| ~3,000 | ❌ 비추천 |
| 10,000+ | 🚨 거의 재앙 |
👉 **“천 개 넘어가면 설계 다시 보자”**가 실무 룰입니다.
SELECT t.*
FROM target_table t
JOIN temp_ids i ON t.id = i.id;
📌 장점
SELECT *
FROM orders
WHERE user_id IN (
SELECT user_id
FROM user_list
);
👉 값이 테이블로 관리될 때는 이게 훨씬 낫습니다.
WHERE FIND_IN_SET(col, '1,2,3,4')
❌ 인덱스 못 씀
❌ 성능 최악
| DB | IN 제한 |
| MySQL | 제한 없음 (현실적 한계 있음) |
| Oracle | 1,000개 제한 🚨 |
| PostgreSQL | 제한 없음 |
| SQL Server | 제한 없음 |
👉 Oracle 쓰다가 MySQL 오면 헷갈리는 포인트
MySQL IN 절은 제한은 없지만
1,000개 넘으면 구조를 바꿔라.
→ 임시 테이블 + JOIN이 정답

| SQL 큐브리드 테이블 간 차집합 difference 위,아래 순서 차이 (0) | 2026.01.16 |
|---|---|
| 큐브리드 ini 설정파일 수정, 데이터 추출 성능 개선하기 (0) | 2026.01.14 |
| SUM(DECODE(SIGN(point), 1, 1, 0)) 해당 쿼리 뜻은? (0) | 2026.01.14 |
| mysql 테이블 컬럼, 인덱스 구조 보는 명령어는? (0) | 2025.12.20 |
| /*+USE_IDX ORDERED*/ /*+USE_NL ORDERED*/ /*+USE_IDX*/ 인덱스 힌트 차이 (0) | 2025.12.17 |