페이지 로딩이 느려지는 이유: 많은 데이터를 가져올 때 발생하는 문제
웹페이지를 호출할 때 데이터를 한꺼번에 많이 가져오면 페이지가 느려지는 경우가 자주 발생합니다. 특히, 데이터베이스에서 많은 데이터를 조회하고 필터링하는 작업을 하면서 이 문제가 더욱 두드러지죠.
제 경우에는 IN 조건으로 리뷰 데이터를 가져오고, 그 데이터를 GROUP BY로 묶어 중복을 제거했더니, 페이지 로딩 시간이 너무 길어졌습니다. 실제로, 20분에서 30분 이상 로딩 표시만 나오는 상황이 발생했습니다.
데이터베이스에도 이미 많은 데이터가 쌓여있었고, 한 번에 가져와야 할 데이터도 상당한 양이었기 때문에 이 문제는 더 심각해졌죠. 결국, 다양한 방법을 시도해 해결해야 했습니다.
시도 1: IN 조건에서 반복문으로 전환
처음 시도한 해결 방법은 IN 조건을 사용하지 않고, 반복문을 통해 데이터를 하나씩 가져오는 방식이었습니다. 이론적으로는 각 데이터를 개별 쿼리로 가져오면 성능이 나아질 것으로 보였지만, 실제로는 문제가 더 악화되었습니다.
예를 들어, 다음과 같이 IN 조건을 사용하던 코드를 반복문으로 바꿔보았습니다.
$sql = "id IN (1,2,3,4,5,6)";
foreach ($ids as $id) {
$sql = "id = $id";
// 데이터베이스 쿼리 실행
}
이 방식은 여러 개의 작은 쿼리를 반복해서 실행하기 때문에 오히려 데이터베이스와의 통신 시간이 증가하면서, 성능이 더 느려졌습니다. 결국 이 방법은 실패했습니다.
시도 2: 뷰(View) 테이블 사용
다음으로, 뷰(View) 테이블을 사용해 데이터를 관리하는 방법을 시도했습니다. 이 방법은 SQL 쿼리의 복잡성을 줄여서 관리하기는 편리하지만, 성능에는 큰 영향을 미치지 않았습니다.
뷰 테이블은 데이터를 조회할 때, 실제로는 원본 테이블에 쿼리를 실행하는 방식으로 동작합니다. 즉, 뷰 자체는 성능을 크게 향상시키지 못하죠. 뷰를 사용하면서 속도가 빨라지지 않는 이유를 묻자, 사수님은 이렇게 말씀하셨습니다:
"뷰는 관리의 편리성을 위해 사용하지, 성능 개선에는 큰 도움이 되지 않습니다. 대신 인덱스를 설정해 보세요."
시도 3: 인덱스 추가로 성능 개선
사수님의 조언에 따라, 테이블에 인덱스를 추가하기로 했습니다. 인덱스는 테이블에서 데이터를 검색할 때 매우 효율적으로 만들어주는 기능입니다. 데이터베이스에서 특정 열을 기준으로 데이터를 빠르게 찾을 수 있도록 돕는 것이죠.
먼저, 테이블 구조는 다음과 같았습니다:
리뷰 번호 | 상품 번호 | 리뷰 점수 | 리뷰 내용 |
기존에 리뷰 번호에만 인덱스가 설정되어 있었지만, 저는 상품 번호에도 인덱스를 추가했습니다. 그 결과, 쿼리 성능이 획기적으로 개선되었습니다.
기존에 리뷰 번호에만 인덱스가 설정되어 있었지만, 저는 상품 번호에도 인덱스를 추가했습니다. 그 결과, 쿼리 성능이 획기적으로 개선되었습니다.
- 인덱스 설정 전: 페이지 로딩 시간이 몇 분 이상 걸림
- 인덱스 설정 후: 페이지 로딩 시간이 0.4초로 개선됨
인덱스 설정은 다음과 같이 수행되었습니다:
1. 리뷰 번호에 인덱스 추가:
CREATE INDEX idx_review_id ON product_review (review_id);
2. 상품 번호에 인덱스 추가:
CREATE INDEX idx_product_id ON product_review (product_id);
인덱스를 추가한 후, 데이터베이스에서 조회 성능이 눈에 띄게 향상되었고, 페이지 로딩 속도도 즉각적으로 개선되었습니다.
결론: 인덱스의 중요성
이번 경험을 통해, 데이터베이스 인덱스의 중요성을 깨닫게 되었습니다. 많은 양의 데이터를 처리할 때는 SQL 쿼리 최적화와 함께 인덱스 설정이 매우 중요합니다. 특히, 데이터를 많이 조회하거나 필터링해야 하는 상황에서는 인덱스를 적절히 활용하는 것이 성능을 크게 향상시킬 수 있습니다.
또한, 성능 문제가 발생할 때는 여러 가지 해결 방법을 시도해 보면서, 실제 시스템에서 어떻게 성능이 변하는지 측정하는 것이 중요합니다. 상황에 따라 각기 다른 해결책이 필요할 수 있기 때문에, 테스트를 통해 최적의 방안을 찾는 과정이 반드시 필요하죠.
다음에 데이터베이스 성능 문제를 만난다면, 인덱스 설정부터 검토해 보세요!
'개발 > 개발 필기' 카테고리의 다른 글
우분투에서 Node.js와 PM2를 사용한 무중단 애플리케이션 실행 방법 (2) | 2024.10.14 |
---|---|
Sentry 서버 재시작 방법 (Docker 환경) (0) | 2024.10.08 |
RISS 논문 수집하기 (8) | 2024.09.16 |
MySQL 3306 포트 종료하기 (0) | 2024.09.12 |
python 실행 방법 (0) | 2024.04.21 |