배경
로컬 데이터베이스에는 거의 13 억 개의 고유 한 행이 있습니다. 각 행은 특정 위도 및 경도 (위치)와 간접적으로 연결됩니다. 각 행에는 날짜 스탬프가 있습니다.
사용 사례
문제는 다음과 같습니다.
- 사용자는 시작 / 종료 날짜 및 값 범위 (예 : 100-105)를 설정합니다.
- 시스템은 주어진 날짜와 일치하는 모든 행을 위치별로 그룹화합니다.
- 시스템은 해당 날짜 동안 지정된 값 범위에 속할 통계적 가능성이있는 위치를 결정합니다.
- 시스템은 모든 일치하는 위치를 사용자에게 표시합니다.
이것은 속도와 규모의 문제입니다.
질문
그러한 시스템이 5 초 안에 사용자에 대한 결과를 검색 할 수있는 가장 저렴한 솔루션 아키텍처는 무엇입니까?
현재 시스템
현재 환경은 다음과 같습니다.
- PostgreSQL 8.4 (업그레이드 가능, 데이터베이스 전환은 옵션이 아님)
- R과 PL / R
- XFS
- WD 벨로시 랩터
- 8GB RAM (Corsair G.Skill; 1.3GHz)
- 쿼드 코어 GenuineIntel 7 (2.8GHz)
- 우분투 10.10
하드웨어 업그레이드가 가능합니다.
업데이트-데이터베이스 구조
수십억 개의 행이 다음과 같은 테이블에 있습니다.
id | taken | location_id | category | value1 | value2 | value3
- id-기본 키
- taken-행에 지정된 날짜
- location_id-위도 / 경도에 대한 참조
- category-데이터 설명
- value1 .. 3-사용자가 쿼리 할 수있는 다른 값
이 taken
열은 일반적으로 일별 연속 날짜 location_id
이며, 때로는 각 위치에 1800에서 2010까지의 데이터가 있습니다 (약 77,000 개의 날짜가 있으며 각 위치에 동일한 날짜 범위의 데이터가 있으므로 이들 중 다수가 복제 됨).
7 개의 범주가 있으며 테이블은 이미 범주별로 분할되어 있습니다 (자식 테이블 사용). 각 범주에는 ~ 1 억 9 천만 개의 행이 있습니다. 가까운 시일 내에 범주 당 행 수가 10 억을 초과 할 것입니다.
대략 20,000 개의 위치와 70,000 개의 도시가 있습니다. 위치는 위도와 경도로 도시와 상관됩니다. 각 도시를 특정 도시에 할당한다는 것은 도시의 경계를 찾는 것을 의미합니다. 이는 사소한 작업이 아닙니다.
아이디어
내가 가진 몇 가지 아이디어는 다음과 같습니다.
- 데이터베이스를 호스팅 할 클라우드 서비스를 찾으십시오.
- 만들기 SSD를 RAID 스트라이프 (큰 비디오).
- 도시별로 모든 위치를 통합하는 테이블을 만듭니다 (사전 계산).
감사합니다!