관리자 대시보드는 서비스 사용자 데이터를 모니터링하고 관리하는 중요한 도구입니다. 특히, 많은 사용자를 처리하는 대시보드에서는 성능이 중요한 이슈로 대두됩니다. 수백 명에서 수십만 명 이상의 사용자 데이터를 처리하려면 어떻게 해야 할까요? 이 글에서는 데이터의 규모에 따른 성능 최적화 전략을 살펴보고, 적절한 쿼리 설계 및 데이터 처리 방식을 제안합니다.
먼저 "많은 데이터"의 기준을 정리해보겠습니다. 일반적으로 데이터베이스에서 처리하는 데이터는 다음과 같은 규모로 나눌 수 있습니다.
데이터베이스에 저장된 사용자 수가 많을수록, 조회 시 성능에 영향을 미치는 요소들이 많아집니다. 관리자가 사용하는 대시보드는 일반적으로 빠르고 정확한 응답 시간이 중요하므로, 데이터가 많아질수록 성능 최적화를 고려해야 합니다.
작은 규모(수백 ~ 수천 명의 사용자):
이 정도 규모의 사용자 데이터를 조회할 때는 성능 문제가 크게 발생하지 않습니다. 대부분의 데이터베이스 시스템은 이러한 규모를 처리할 수 있으며, 단순한 검색이나 조회에도 성능 저하가 적습니다.
중간 규모(수만 명의 사용자):
사용자가 수만 명에 달하면 데이터베이스에서 페이징과 필터링이 필요합니다. 페이징을 통해 한번에 많은 데이터를 가져오는 것을 방지하고, 필요한 데이터만 조회하는 방식으로 성능을 관리할 수 있습니다. 검색 조건에 따른 인덱스 최적화와 쿼리 성능 튜닝도 중요한 요소입니다.
대규모(수십만 명 이상의 사용자):
수십만 명 이상의 데이터를 실시간으로 처리하는 것은 성능 최적화의 핵심 과제입니다. 이 정도 규모에서는 쿼리 성능뿐만 아니라 데이터베이스 구조, 인프라 성능, 캐싱 등의 최적화가 필요합니다. 또한, 분산 데이터 처리나 데이터 샤딩 같은 고급 기술을 고려해야 할 수도 있습니다.
대시보드에서 많은 사용자 데이터를 실시간으로 처리할 때, 성능을 최적화하는 몇 가지 방법이 있습니다.
많은 데이터를 한번에 조회하는 것은 성능에 큰 영향을 미칩니다. 페이징 처리를 통해 일정 범위의 데이터만 가져오도록 제한하면, 데이터베이스에 대한 부담을 줄일 수 있습니다. 일반적으로 대시보드에서는 한 번에 모든 사용자를 조회하는 것보다는, 한 페이지당 10명, 20명처럼 제한된 수의 사용자 정보를 보여주는 방식이 적합합니다.
SELECT *
FROM users
LIMIT 20 OFFSET 0; -- 한 페이지당 20명 조회
페이징 처리에서는 LIMIT
와 OFFSET
을 사용해 데이터를 나누어 처리할 수 있습니다. 대용량 데이터 처리 시에는 특히 필수적인 기법입니다.
관리자 대시보드에서는 사용자 ID, 병원 이름, 부서명 등 다양한 검색 조건을 사용할 수 있습니다. 이를 처리할 때는 적절한 인덱스를 설정해 성능을 최적화해야 합니다. 인덱스는 검색 조건에 맞는 데이터를 빠르게 찾을 수 있도록 도와줍니다.
예를 들어, userId
또는 hsptlNm
으로 검색할 때 해당 필드에 인덱스가 설정되어 있으면 검색 성능이 크게 향상됩니다.
SELECT *
FROM users
WHERE userId LIKE '%searchTerm%'
ORDER BY crtDt DESC
LIMIT 20 OFFSET 0;
여기서 중요한 점은 검색 필드에 대한 인덱스 설정입니다. 인덱스가 없으면 데이터베이스는 모든 레코드를 검색해야 하므로 성능이 크게 저하됩니다.
데이터를 정렬하는 작업도 성능에 영향을 미칩니다. 예를 들어, 가입일(crtDt
) 기준으로 정렬하거나 설치된 서비스 수(instl_cnt
) 기준으로 정렬하는 경우, 정렬 대상 컬럼에 인덱스를 설정하면 성능이 향상됩니다.
SELECT *
FROM users
ORDER BY crtDt DESC
LIMIT 20 OFFSET 0;
만약 인덱스가 없다면, 데이터베이스는 모든 데이터를 메모리에 올려놓고 정렬해야 하므로 성능이 저하될 수 있습니다.
UNION ALL
과 같이 여러 테이블에서 데이터를 결합하는 경우, 각 테이블에서 필터링 조건을 개별적으로 적용하는 것이 성능에 유리합니다. 데이터가 많을수록 불필요한 데이터 결합을 최소화해야 합니다.
예를 들어, 서비스 유저와 EMR 유저를 조회할 때, UNION ALL
을 사용해 결합한 후 필터링하는 것보다 각 쿼리에서 먼저 필터링한 후 결합하는 것이 더 효율적입니다.
SELECT userId, crtDt
FROM (
-- 첫 번째 유저 그룹 조회
SELECT u.user_id AS userId, u.created_at AS crtDt
FROM users u
WHERE u.user_id LIKE '%searchTerm%'
UNION ALL
-- 두 번째 유저 그룹 조회
SELECT cu.user_id AS userId, cu.created_at AS crtDt
FROM community_users cu
WHERE cu.user_id LIKE '%searchTerm%'
) AS combined_users
ORDER BY crtDt DESC
LIMIT 20 OFFSET 0;
이 방식은 각 쿼리에서 불필요한 데이터를 필터링한 후 결합하므로, 대규모 데이터에서 성능 저하를 방지할 수 있습니다.
실시간 데이터 조회가 아닌 통계나 리포트 데이터처럼 자주 변하지 않는 정보는 캐싱을 활용할 수 있습니다. 캐싱을 통해 자주 조회되는 데이터를 메모리에 저장하고, 데이터베이스 조회를 줄여 성능을 크게 향상시킬 수 있습니다.
인덱스를 적절하게 활용하는 것이 성능 향상의 핵심입니다. 특히, 자주 검색되거나 정렬되는 필드에 인덱스를 설정하면 성능을 극대화할 수 있습니다. 일반적으로 다음 필드에 인덱스를 설정하는 것이 좋습니다:
인덱스는 데이터베이스의 성능을 크게 개선할 수 있지만, 너무 많은 인덱스를 사용하면 쓰기 작업(insert, update) 시 성능이 저하될 수 있으니 주의해야 합니다.
관리자 대시보드에서 많은 사용자의 데이터를 실시간으로 조회할 때는 성능 최적화가 필수적입니다. 특히 데이터가 수만 명 이상일 경우, 페이징 처리, 검색 필터링, 정렬 최적화를 통해 성능을 향상시킬 수 있습니다. 대규모 데이터에서는 쿼리 성능을 높이기 위해 각 테이블에서 개별적으로 필터링하는 것이 효율적이며, 인덱스 설정을 통해 조회 성능을 높일 수 있습니다.
성능 최적화를 위한 다양한 방법을 적용해보면서, 실제 환경에서 가장 적합한 방법을 찾는 것이 중요합니다. EXPLAIN 명령어로 쿼리 실행 계획을 확인하고, 데이터베이스 튜닝을 병행한다면, 대시보
드의 성능을 더욱 극대화할 수 있을 것입니다.