2011-07-03 5 views
3

사용자가 기사를 게시 할 수있는 웹 사이트가 있으며 각 기사 방문 및 저자 추천자에 대한 전체 통계를 제공하고자합니다. 실현은 여기 아주 단순 해 보입니다. 모든 방문에 대한 데이터베이스 레코드를 저장 한 다음 집계 함수를 사용하여 그래프를 그리는 등의 작업이 필요합니다.대규모 방문 통계 수집 방법

문제는 기사가 24 시간 내에 약 300,000 회의 조회를 받고 한 달 만에 통계 표가 약 9 백만 건의 레코드를 얻게되는데 이는 내 서버가 강력하지 않기 때문에 매우 큰 숫자입니다.

이러한 종류의 작업에 대한 해결책이 있습니까? 정확성을 잃지 않고 장기 통계를 저장할 수있는 알고리즘이나 캐싱 메커니즘이 있습니까?

P. 여기에 내 원래의 통계 테이블 : 당신이 당신의 통계 데이터를 직접 저장에 특히 예민한 아니라면

visitid INT 
articleid INT 
ip INT 
datetime DATETIME 

답변

6

으로 가정 할 수 있습니다. 가정용 양방향 사용 추적 솔루션 (다른 응답에서 제안한대로 GA를 사용하는 것)을 사용하면 찾고있는 데이터베이스가 두 개일 수 있습니다 :

  • vist 이벤트를 캡처하는 "실시간"데이터베이스.
  • "실시간"데이터베이스의 데이터가 정기적으로 수집되어 "선택적으로 집계되고 인덱싱"되는 "오프라인"데이터베이스입니다.

이 설정의 목적은 대부분 운영상의 문제입니다. "실시간"데이터베이스는 빠른 삽입을 위해 인덱싱되지 않으며 최소 색인화되어 트래픽이 가벼운 경우 매일 밤 일반적으로 비워지며 "오프라인"데이터베이스는 하루 동안 수집 된 이벤트를 선택합니다.

두 데이터베이스 모두 매우 동일한 스키마를 가질 수 있으며 "오프라인"데이터베이스는 다양한 집계 형식을 도입 할 수 있습니다. 오프라인 데이터베이스에 적용되는 구체적인 집계 정보는 데이터베이스의 크기를 유지하려는 요구와 중요한 것으로 간주되는 데이터에 따라 크게 달라질 수 있습니다 (대부분의 통계/집계 함수는 정보 손실을 가져 오며 어떤 손실을 결정해야합니다 받아 들일 수 있고 그렇지 않은).

사용 로그 값의 "반감기"특성으로 인해 세부 정보의 상대적인 가치가 시간에 따라 감소하므로 일반적인 전략은 여러 계층의 정보를 집계하여 마지막으로 수집 한 데이터를 말합니다. X 일은 대체로 손대지 않으며 X 일과 Y 일 사이에 수집 된 데이터는 부분적으로 집계되며 마지막으로 Y 일보다 오래된 데이터는 가장 현저한 정보 (예 : 히트 수) 만 유지합니다.