2013-04-12 6 views
0
나는 다음과 같은 테이블 구조의 역사를 유지 대해 생각해 봤는데

: 여기서 내가 할 수있는 (유지 많은 양의 효율적

`id` bigint unsigned not null auto_increment, 
`userid` bigint unsigned not null, 
`date` date not null, 
`points_earned` int unsigned not null, 
primary key (`id`), 
key `userid` (`userid`), 
key `date` (`date`) 

이것은 SO의 평판 그래프로하는 것처럼 내가 뭔가를 할 수 있습니다 내가 사이트에 가입 한 이후로 내 rep 게인을보십시오).

여기하지만 문제 야 :

SELECT SUN(DATEDIFF(`lastclick`,`registered`)) FROM `users` 

결과는 가깝게 차이 25,000,000 사람이 일하지 않습니다로했다 : 난 그냥 간단한 계산을 달렸다. 하루에 사용자 당 한 행을 유지하려는 경우 큰 테이블 일 뿐이며 성장이 더 기다리고 있습니다. 사용자가 온라인에 오지 않는 날을 제외해도 여전히 엄청납니다.

이렇게 많은 양의 데이터를 유지 관리하는 데 조언을 제공 할 수있는 사람이 있습니까? 이 테이블에서 실행되는 유일한 쿼리는 다음과 같습니다

SELECT * FROM `history` WHERE `userid`=? 
SELECT SUM(`points_earned`) FROM `history` WHERE `userid`=? AND `date`>? 
INSERT INTO `history` VALUES (null,?,?,?) 

ARCHIVE 엔진은 예를 들어, 여기에 어떤 소용이겠습니까? 아니면 색인 때문에 걱정할 필요가 없습니까?

+0

사용자 및 기록에 대한 완전한 테이블 구조를 추가하십시오 – Stephan

+0

어떤 rdms를 사용하고 있습니까? mysql? – Stephan

답변

1

의 MySQL의 가정 :
을 : 역사 테이블

  1. 당신이 partitioning 당신이 최선의 파티션 규칙을 설정할 수 있습니다 고려해야하고 당신이 쿼리 무엇을보고 2 개 선택이있다. 날짜 별 파티션 (예 : 1 파티션 = 1 개월)
    b. 사용자가 파티션 (그것을이 당신이 사용자에 대한 복합 인덱스를 사용할 수 있습니다 (here)

  2. 를 파티션 가지 치기를 사용하는 경우 충당 도움이 될 것입니다
    날짜 (당신이 300 개 파티션과 1 개 파티션 = 100000 사용자가 있다고 가정 할 수 있습니다) 당신이있을 때,

  3. 피하기에게) 처음 2 개 쿼리 INSERT 문을 사용됩니다 큰 데이터는이) 테이블이 분할되어

그리고 가장 중요한 작동하지 않습니다 (LOAD DATA 사용 ... 방대한 양의 데이터를위한 최고의 엔진은 MyISAM입니다