mb_id 대신에 mb_no 사용하면 속도 차이가 있을까요?
본문
현재 mb_id 값을 이메일로 사용하고 있습니다.
그러다보니 20자리 넘는 id가 꽤 많더라구요.
혹시 쿼리문 돌릴 때 mb_id 대신에숫자로만 이루어진 mb_no 값을 사용하면 유의미한 속도 차이가 있을까요?
답변 3
네, 유의미한 속도 차이가 날 가능성이 높습니다.
이유를 단계별로 설명드리면요.
1. 문자열 PK vs 숫자 PK 성능 차이
-
문자열(
VARCHAR
, 특히 이메일처럼 길이가 길고 가변적)로mb_id
를 PK나 JOIN 조건에 쓰면,-
비교할 때 문자 단위로 일일이 비교해야 해서 CPU 연산량이 많아집니다.
-
인덱스 크기가 커져서 디스크/메모리에서 읽어야 하는 양이 늘어납니다.
-
-
숫자(
INT
,BIGINT
)로mb_no
를 PK나 JOIN 조건에 쓰면,-
비교 연산이 훨씬 단순하고 빠릅니다 (정수 비교는 CPU 한 번에 끝남).
-
인덱스 크기도 작아져서 더 많은 데이터가 메모리에 캐싱됩니다.
-
2. 실제 인덱스 크기 비교 예시
-
VARCHAR(50)
(UTF-8 기준, 이메일 최대 50자)-
인덱스 엔트리 하나가 최대 150~200바이트
-
-
INT UNSIGNED
-
인덱스 엔트리 하나가 4바이트
-
-
같은 100만 행 기준
-
문자열 인덱스: 약 150~200MB
-
숫자 인덱스: 약 4MB
→ 인덱스 I/O와 메모리 사용량이 40~50배 차이 날 수 있음.
-
3. MySQL 실행 계획 차이
-
WHERE mb_id = '*** 개인정보보호를 위한 이메일주소 노출방지 ***'
→ 인덱스 탐색 + 문자열 비교 (collation 규칙 포함) -
WHERE mb_no = 12345
→ 인덱스 탐색 + 정수 비교 (매우 빠름)
숫자 키는 B-Tree 탐색에서도 깊이가 줄어드는 경우가 많아 캐시 적중률이 올라갑니다.
4. 실무에서 쓰는 방식
그누보드 5에서도 mb_no
(AUTO_INCREMENT 정수)를 PK로 두고,
mb_id
는 UNIQUE KEY로 유지하면서 검색은 가능하게 하는 방식이 일반적입니다.
JOIN이나 WHERE 조건이 빈번히 쓰이는 곳에서는 mb_no
를 사용하면
쿼리 속도와 인덱스 효율이 확실히 좋아집니다.
✅ 결론
-
mb_id
(문자열) →mb_no
(정수)로 바꾸면 속도 차이 납니다. -
데이터가 많을수록, 인덱스 탐색이 많은 쿼리일수록 차이가 커집니다.
-
이메일 검색이 필요하면
mb_id
는 그대로 두고, 내부 로직에서 식별자는mb_no
로 통일하는 게 좋습니다.
이라고 챗지피티로 찾아보니 나오네요~ 조건문이 mb_id로 할것이 아니면 고유번호도 괜찮은데 잘 판단해서 하는게 좋아요
유의미한 속도 차이는 없습니다.
두 컬럼 모두 Primary Key 또는 Unique Index로 설정되어 있기 때문입니다.
실제로는 인덱스 여부가 성능에 더 큰 영향을 주며,
문자열/숫자 비교로 인한 차이는 극히 미미합니다.
mb_no에 PRIMARY KEY + AUTO_INCREMENT 설정되어 있다면, SQL은 이를 클러스터 인덱스로 최적화합니다. 또한 mb_id에 UNIQUE 인덱스가 있더라도, VARCHAR 인덱스는 비교 비용이 더 큽니다.
하여
mb_no를 중심으로 쿼리 설계하시면 확실히 성능 이점이 있으며, 특히 회원 수가 많아질수록 그 속도차이를 느낄수 있습니다.
물론 단일 조회시에는 큰차이는 느낄수 없습니다. 하지만 대용량 검색시 인덱스 크기 가 작아지니 빠른탐색이 된다라는뜻이니, 비교연산이 빠르며 메모리 캐싱이 효율적으로 대용량 처리 유리하다 보니 빠를 수있다고 보시면됩니다. 이는 데이터 INT 와 VARCHAR 타입의 차이라고 보시면됩니다.