MySQL 접속(커넥션) 부하를 줄이는 방법

① “접속 자체를 줄이기”,
② “접속 비용을 싸게 만들기”,
③ “접속이 몰려도 버티게 하기” 3갈래로 정리하면 됩니다.

1) 접속 자체를 줄이기 (가장 효과 큼)

  • Connection Pooling 사용
    매 요청마다 새로 연결하지 말고, 앱에서 풀로 재사용하세요. (Java HikariCP, .NET/MySqlConnector pooling, Node mysql2 pool 등)
  • 트래픽/조회 캐싱
  • 읽기 트래픽 분리(읽기 복제본/리드 레플리카)
  • 불필요한 “짧은 쿼리 다건”을 “한 번의 쿼리”로
  • HTTP keep-alive / gRPC 등과 별개로, DB는 “요청당 1커넥션” 패턴을 피하기

2) 접속 비용을 싸게 만들기

  • DNS/네트워크 지연 최소화
  • TLS(SSL) 사용 시
  • 인증 플러그인/설정 점검
  • Prepared Statement 재사용

3) 접속이 몰려도 버티게 하기 (서버/설정/아키텍처)

  • max_connections 무작정 올리기 금지
  • 앱 풀 크기(중요)
  • Thread Pool/Buffer 튜닝(대표적으로 InnoDB)
  • Proxy 계층 도입
  • 커넥션 폭주 방지(백프레셔)

4) 운영에서 바로 확인할 것(진단 체크리스트)

  • 현재 커넥션 상태
  • “커넥션 생성이 병목인지” 확인
  • 슬로우 쿼리
  • 에러 패턴

5) 가장 흔한 “즉시 효과” 조합

  1. 앱 커넥션 풀 적용 + 풀 크기 상한 설정
  2. 캐시(특히 설정/코드/상태성 조회) 도입
  3. N+1 제거 / 배치화
  4. 필요 시 읽기 레플리카 + 라우팅 또는 ProxySQL

원하시면 **현재 구조(언어/프레임워크, 앱 인스턴스 개수, 현재 max_connections, 평균 QPS/피크 QPS, “매 요청 새 연결인지”)**만 알려주면, “풀 크기 산정”과 “우선순위 조치 5개”를 딱 맞게 잡아드릴게요.

DB max_connections 10으로 제어 하는 방법

MySQL에서 **동시 접속을 10개로 “강제”**하려면 핵심은 max_connections=10 설정입니다. (그리고 관리자/모니터링용 여유도 같이 고려해야 합니다)

1) 즉시(재시작 없이) 10으로 바꾸기

관리자 권한으로 실행:

SET GLOBAL max_connections = 10;
  • 즉시 적용됩니다.
  • MySQL 재시작하면 원래 값으로 돌아갈 수 있으니, 아래 “영구 적용”도 같이 해야 합니다.
  • 이미 10개 초과로 연결돼 있으면, 기존 연결은 유지되고 새 연결부터 제한됩니다.

현재 값 확인:

SHOW VARIABLES LIKE 'max_connections';

2) 영구 적용(재시작 후에도 유지)

MySQL 설정 파일에 넣고 재시작합니다.

Linux (대부분)

/etc/my.cnf 또는 /etc/mysql/my.cnf 또는 /etc/mysql/mysql.conf.d/mysqld.cnf

-mysqld-
max_connections = 10

Windows

my.ini 또는 my.cnf (보통 MySQL 설치 폴더 또는 ProgramData)

-mysqld-
max_connections = 10

적용 후 MySQL 재시작 필요.

3) “관리자 접속도 막히는” 사고 방지 (강력 추천)

max_connections=10으로 너무 낮게 잡으면, 앱 접속이 10개를 다 먹었을 때 DBA가 로그인도 못 하는 상황이 생길 수 있습니다.

그래서 보통 다음도 같이 봅니다.

(A) 관리자용 예비 커넥션

MySQL은 extra_max_connections(버전에 따라) / 또는 max_connections 외에 관리자 접속을 위한 별도 슬롯 개념이 제한적이라,
현실적으로는:

  • 앱 풀을 8~9로 제한하고
  • DB max_connections는 10~20 정도로 두는 방식이 안전합니다.

(B) 앱에서 커넥션 풀 상한을 10보다 더 작게

DB를 10으로 막는 것만으로는 “폭주”가 사라지지 않고 에러만 늘 수 있어요.
앱 쪽 풀도 같이 제한해야 합니다. (예: 인스턴스가 여러 개면 합계가 10을 넘으면 바로 초과)

4) 설정 확인/모니터링 명령

현재 접속 수:

SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';

프로세스 목록:

SHOW PROCESSLIST;

주의 (운영에서 흔히 터지는 문제)

  • 앱 서버가 2대 이상이면 각 서버가 풀 10개씩 잡아버려서 바로 막힙니다.
    → “전체 합계가 10”이 되게 설계해야 합니다.
  • 커넥션을 매번 새로 생성하는 코드가 있으면 Too many connections가 급증합니다. 풀링 필수.