이 글에서는 MySQL에서 일별, 월별, 연도별 웹 방문 수와 전체 총 방문 수를 집계하는 쿼리를 작성하는 방법을 알아보겠습니다.
참고: 이 예제에서는 'DBNAME'이라는 이름의 데이터베이스와 'tableName'이라는 이름의 테이블이 이미 생성되어 있다고 가정합니다.
그럼 웹 방문 수를 일별, 월별, 연도별로 집계할 때 사용할 수 있는 MySQL 쿼리를 살펴보겠습니다.
쿼리 예시
SELECT COUNT(DISTINCT ip) FROM tableName WHERE create_at >= LAST_DAY(NOW()) + INTERVAL 1 DAY - INTERVAL 1 MONTH AND create_at < LAST_DAY(NOW()) + INTERVAL 1 DAY
쿼리 동작 원리
위 쿼리는 DATETIME 값의 범위를 검색하는 방식으로 동작합니다. 현재 달의 시작 시점부터 검색을 시작하여 다음 달의 시작 시점까지, 즉 다음 달 첫날은 포함하지 않은 범위까지만 데이터를 조회합니다.
여기서 (create_at, ip) 두 컬럼으로 구성된 복합 커버링 인덱스(compound covering index)를 생성하면, 위 쿼리를 통해 일별, 월별, 연도별 웹 방문 수를 효율적으로 집계할 수 있습니다.
복합 인덱스가 있으면 MySQL이 필요한 인덱스 범위만 스캔하면 되기 때문에 전체 테이블을 읽는 것보다 훨씬 빠른 성능을 기대할 수 있습니다.
참고: 위 쿼리는 TIMESTAMP 타입의 데이터에 대해서도 정상적으로 동작합니다.